Aller au contenu


Photo

Glenn Robot Humanoide


  • Veuillez vous connecter pour répondre
994 réponses à ce sujet

#461 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 12 juillet 2017 - 08:15

 

Par exemple un pointeur qui n'est pas libéré.

 

Voilà et du coup ton objet existe toujours en mémoire mais n'est plus référencé et du coup il prend de la place pour rien et imagine que ça t'arrive dans une partie de code où tu passes souvent, à chaque passage, tu en laisse un nouveau.

 

<ma vie>

Je programme principalement en .net et le jour ou j'ai du faire du delphi (qui dans le principe fonctionne comme le C++) j'ai codé comme d'habitude et une partie de l'appli était du dessin ; bah mon appli au bout de 20 minutes d'utilisation intensive plantait : system.outofmemory jusqu'à ce qu'on m'explique qu'en delphi il faut libérer les objets

</ma vie>

 

Le but n'est pas de décourager, juste d'être vigilant, sur un projet simple sans trop de pointeur, d'objets imbriqués, et en suivant les tutos pour l'utilisation des librairies (genre opencv) qui indique les libérations, tout devrais bien se passer, et puis on est là s'il faut faire une révision de code.

 

Voilà :)



#462 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 12 juillet 2017 - 08:16

Hein!!?? C'est quoi ça????

 

Par exemple un pointeur qui n'est pas libéré.


Pour être exact, en C/C++, la gestion de la mémoire est potentiellement plus explicite qu'en python. Quand on déclare une variable qui est destinée à contenir un tableau, il faut réserver l'espace en mémoire pour stocker les données.
Si c'est fait de manière statique, pas de problèmes, exemple:
 
float mesComptesEnBanque[5];
mesComptesEnBanque[2] = -500.0; // :(
mesComptesEnBanque[4] = 1000; // \o/
mais on ne connaît pas toujours la taille des données qu'on veut stocker au début, il peut donc être nécessaire de passer par un pointeur pour initialiser dynamiquement l'espace mémoire:
float * mesComptes;
mesComptes = new float[<taille_récupérée_en_argument>];
Dans ce cas, la variable qui est déclarée est un pointeur sur la zone mémoire (l'adresse de cette zone, où plus imagé, l'adresse de notre entrepôt qu'on loue pour stocker nos bidules), mais quand on sort du bloc où cette variable a été déclaré (chercher : portée des variables en c++), seul le pointeur est supprimé, pas la mémoire allouée. En gros, on oublie l'adresse de l'entrepôt, mais on a oublié de stopper la location de l'espace. Du coup, cette mémoire reste bloquée et non utilisable par le système (à ma connaissance il n'existe pas de moyen de récupérer cette mémoire à par redémarrer l'ordi, mais je me trompe peut-être).
Pour éviter ça, chaque part de mémoire allouée dynamiquement doit être désallouée avec delete avant que son adresse ne soit perdu (je vous laisse chercher ça, pas le temps de développer plus maintenant).

EDIT : grillé par arobasseb !
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#463 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 12 juillet 2017 - 08:35

Oh Punaise !! ça c'est de l'info !!

 

Merci je serais passé complétement à côté !!



#464 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

Posté 12 juillet 2017 - 09:24

Depuis la programmation en C#, adieu les * pointeurs, bonjour les objets.



#465 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 12 juillet 2017 - 11:13

Ok, je crois avoir compris, libérer la mémoire avec des variables inutiles dans certains cas pour éviter une saturation qui pourrait nuire au programme, j'espère que dans le cours d'OpenClassRooms ils en parlent, je vais bien voir, par contre c'est vicieux le C++...


signature_01.png -->

 

Mon Tipeee
 


#466 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 12 juillet 2017 - 02:37

Ok, je crois avoir compris, libérer la mémoire avec des variables inutiles dans certains cas pour éviter une saturation qui pourrait nuire au programme, j'espère que dans le cours d'OpenClassRooms ils en parlent, je vais bien voir, par contre c'est vicieux le C++...

Pas tout à fait. Les variables "inutiles" ne restent pas : la fin d'un bloc (fermeture d'une accolade : " } ") supprime les variables qui étaient déclarées après l'accolade ouvrante ( " { " ) : c'est le mécanisme de portée des variables. Le problème vient quand on supprime des pointeurs : on supprime juste l'accès à la mémoire, mais on ne libère pas la mémoire en question. Quand le programme quitte, des données pointées par "mesComptes'" dans mon exemple au dessus sont toujours en mémoire, et il n'y a plus de moyen d'y accéder. Même si on relance le programme, on fait autre chose, etc. La fuite de mémoire nuit à l'ordinateur en entier, pas juste ton programme.


R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#467 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 12 juillet 2017 - 05:26

Hum, mouais mouais, bon ben je verrai ça quand j'arriverai à cette étape, car là du coup ça ne me dit trop rien. ^^


signature_01.png -->

 

Mon Tipeee
 


#468 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 18 juillet 2017 - 01:14

C'est tout de même incroyable l'usine à gaz qu'est le C++, franchement je n'arrive pas à comprendre pourquoi vous codez la dessus.

 

PS : Aux aficionados du C++, ne le prenez pas mal, je trouve juste que certaines choses sont une perte de temps et en plus à rallonge.

 

Bref, c'était mon mini coup de gueule lol ^^

 

PS2 : c'est moi qui vais avoir une fuite de mémoire et ça va nuire à mon cerveau en entier ^^ lol


signature_01.png -->

 

Mon Tipeee
 


#469 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 18 juillet 2017 - 01:57

Pour ça : https://benchmarksga...thon3&lang2=gpp

:P

 

Python est plus facile d'accès que C++, clairement, et pour beaucoup de tâches, c'est suffisant. Mais d'expérience, quand tu as besoin de faire tourner 10 réplications d'une expérience avec 10 variations de 3 paramètres (soit un total de 10000 expériences), tu es content que ton expérience puisse être calculée 10 à 100 fois plus vite. Exemple, répéter 10000 le test fannkuch-redux du lien prendrait 55,99 jours avec du code python et seulement 1,19 jour avec du code c++ (28,75 heures). Si l'algorithme et/ou les données le permettent, en parallélisant les calculs, tu peux même faire tomber ce temps à quelques heures contre quelques jours en python.

Dans le cas d'un robot, la raison est plutôt au niveau de la fréquence d'exécution. Un algorithme critique (ou en tout cas, important) doit pouvoir tourner en moins de temps que la boucle de contrôle. Exemple : déterminer les obstacles à partir d'une image de profondeur (type Kinect) ou de deux images en stéréo. Une boucle de contrôle à 50 ou 100 Hz demande que le processus de traitement d'image soit inférieur à 10 à 20 ms. Du coup, la moindre optimisation est bonne à prendre, et celle du choix du langage tombe sous le sens.


R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#470 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 18 juillet 2017 - 01:57

Essaye de programmer en C (pas en C++) comme tu programmerais en Basic, sans te soucier des objets, pointer, fuite mémoire etc.
Puis, quand tu y auras pris goût, tu pourras voir les concepts plus compliqués.

#471 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 18 juillet 2017 - 03:31

@ R1D1 : cool le benchmark, cela à apporté plus de clarté à ton explication, effectivement le gain est important.

 

@ Oracid : nan nan nan , je ne vais pas m'embéter à apprendre le C, nan nan nan. :)

 

Bon ben j'y retourne sur ces cours, mais va falloir que je revienne sur certaines choses, car ce n'est pas tout à fait clair pour l'instant...

 

Comme par exemple, pourquoi déclaré un prototype de fonction alors que l'on pourrait peut être placer la fonction juste avant le "main" ? 

#include <iostream>
using namespace std;

// Prototype de la fonction
int nombreDeSecondes(int heures, int minutes, int secondes);

// Main
int main()
{
    cout << nombreDeSecondes(1, 10, 25) << endl;
    return 0;
}

// Définition de la fonction
int nombreDeSecondes(int heures, int minutes, int secondes)
{
    int total = 0;
    total = heures * 60 * 60;
    total += minutes * 60;
    total += secondes;
    return total;
}

Merci ^^


signature_01.png -->

 

Mon Tipeee
 


#472 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 18 juillet 2017 - 03:58

Comme par exemple, pourquoi déclaré un prototype de fonction alors que l'on pourrait peut être placer la fonction juste avant le "main" ?

C'est pour aider le compilateur, ne m'en demande pas plus.
Essaye de supprimer cette ligne si elle t'embête, cela peut fonctionner.
Mais cette manière de faire est conseillé.

Tu peux déplacer ta fonction avant le main, mais c'est pas génial pour la lisibilité du main qui du coup se trouve tout en bas d'un code qui peut être très long.

#473 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 18 juillet 2017 - 04:00

Pas de soucis si c'est conseillé, c'est que je ne comprend pas, ça se trouve je verrai ça plus loin dans le cours, j'avais l'habitude de placer le peu de fonction avant le main en Python ^^

 

(mode formatage cerveau = delete python) lol


signature_01.png -->

 

Mon Tipeee
 


#474 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 18 juillet 2017 - 04:19

Parce que ta fonction ne sera pas toujours dans le même fichier.

En C++, on sépare en général la déclaration de la définition/implémentation. On écrit un fichier header en .h dans lequel on déclare les classes, les fonctions que l'on veut créer, puis on définit/implémente ces classes dans des fichiers .cpp. En quelque sorte, le fichier header indique ce qui est disponible, le fichier cpp indique comment ce qui est disponible fonctionne.

Comme en python, tu peux vouloir séparer ton code en "programme principal" et "outils". Par exemple, dans le code que tu postes, tu fais appel aux flux d'entrée/sortie standards (le flux de sortie ici), mais tu n'as pas implémenté la classe qui te permet de faire ça. À la place, tu as fais un "#include <iostream>" qui signifie "cherche dans les emplacements standards le fichier header iostream.h (ou .hpp) et inclus le ici". Ce fichier contient toutes les déclarations de ce que tu peux faire (les fonctions, etc. disponibles). Cela suffit au compilateur pour reconnaître ce symbole dans ton code (quand tu appelles cout) et savoir que ce bout de code doit être complété plus tard, lors de l'édition de liens.

 

Pour résumer (quand je dis "fonction" dans le texte suivant, comprendre "fonctions, classes, etc.") :

- soit tu déclares et définis toutes tes fonctions avant le code où elles sont appelées. Dans ce cas, il me semble que le prototype n'est pas nécessaire.

- soit tu déclares tes fonctions avant le code qui y fait appel et tu les définis après. Dans ce cas, tu dis au compilateur : "t'inquiète copain, ma fonction nombreDeSecondes que j'utilise dans main() n'est pas un symbole inconnu, c'est définis ailleurs".

- soit tu définis ton code dans un autre fichier, tu le déclares dans un fichier header, puis tu inclus ce dernier dans ton fichier principal pour que le compilateur sache que les fonctions que tu appelles ensuite ne sont pas des erreurs de syntaxe / symboles indéfinis.

- Et non, on n'inclue pas directement les fichiers .cpp, une bonne explication du processus en anglais ici : https://softwareengi...luding-only-the


R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#475 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 18 juillet 2017 - 05:09

Hummm pas tout compris, enfin plus ou moins.

 

Dans le .h c'est le prototype que tu déclares (je reprend le nom prototype comme dans le cour), ensuite je définis ma fonction dans un autre fichier si besoin, ça je crois que j'ai compris ^^

Ce que tu dis lorsque tu déclares c'est le prototype ?

 

Mouais je vais bien voir de toutes façons, petit à petit comme on dit...

 

PS : déjà que le C++ n'est pas évident, mais alors voir le processus de tous ce que tu m'a expliqué en anglais c'est pire lol ^^

Sachant que l'anglais et moi c'est moyen..


signature_01.png -->

 

Mon Tipeee
 


#476 Leon

Leon

    Membre passionné

  • Membres
  • PipPipPipPipPip
  • 1 289 messages
  • Gender:Male

Posté 18 juillet 2017 - 06:53

Essaye de programmer en C (pas en C++) comme tu programmerais en Basic, sans te soucier des objets, pointer, fuite mémoire etc.
Puis, quand tu y auras pris goût, tu pourras voir les concepts plus compliqués.

C'est ce que je fais depuis pas mal d'années : pour mes bidouilles, je dois coder en C# et en C++, mais dans ces 2 langages, je code exactement comme en C, langage que je maitrise beaucoup mieux (et qui ressemble beaucoup au basic).

Et c'est sans utiliser les trucs dont je n'ai pas besoin en C : allocation dynamique de mémoire entre autre.

J'utilise la syntaxe C++ et C# quasiment uniquement pour des appels de librairies faites pour du C# et C++, donc trois fois rien.

 

Je n'ai jamais vraiment compris les concepts qui se cachent derrière les langages orientés objet, et ça ne m'intéresse pas trop, tant que j'arrive à coder ce que je veux. Mais j'avoue que parfois, quand je dois me plonger dans du code déjà écrit en C# ou C++, j'ai vraiment du mal... Beaucoup de mal.

Donc il serait bien que je me donne un coup de pied au cul pour franchir le pas... un jour peut-être!

 

Leon.


BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)


#477 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 18 juillet 2017 - 08:36

Et c'est sans utiliser les trucs dont je n'ai pas besoin en C : allocation dynamique de mémoire entre autre.

Ce n'est pas la chose la moins intéressante. En fait tout est intéressant, mais pourquoi se lancer tout de suite dans des choses compliquées.
En y allant pas à pas, du plus simple au plus compliqué, on doit y arriver sans problème.
D'ailleurs, je pense sérieusement que c'est le langage le plus simple qu'il soit.

#478 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 18 juillet 2017 - 11:14

Hummm pas tout compris, enfin plus ou moins.
 
Dans le .h c'est le prototype que tu déclares (je reprend le nom prototype comme dans le cour), ensuite je définis ma fonction dans un autre fichier si besoin, ça je crois que j'ai compris ^^
Ce que tu dis lorsque tu déclares c'est le prototype ?
 
Mouais je vais bien voir de toutes façons, petit à petit comme on dit...
 
PS : déjà que le C++ n'est pas évident, mais alors voir le processus de tous ce que tu m'a expliqué en anglais c'est pire lol ^^
Sachant que l'anglais et moi c'est moyen..

C'est ça : le prototype te permet de déclarer ta fonction. Évidemment, tu verras tout étape par étape. Pour bien comprendre le C++, je pense qu'il est important de bien comprendre le processus de compilation (que font le préprocesseur, le compilateur, le compilateur pendant l'édition de liens, etc.). Ça justifie pas mal pourquoi on fait certaines choses en C/C++.
 

(...)
Et c'est sans utiliser les trucs dont je n'ai pas besoin en C : allocation dynamique de mémoire entre autre.
(...)
 
Je n'ai jamais vraiment compris les concepts qui se cachent derrière les langages orientés objet, et ça ne m'intéresse pas trop, tant que j'arrive à coder ce que je veux. Mais j'avoue que parfois, quand je dois me plonger dans du code déjà écrit en C# ou C++, j'ai vraiment du mal... Beaucoup de mal.
(...)

Tu n'as jamais eu besoin de faire un malloc après avoir déclaré un pointeur en C ? Non pas que ça soit obligatoire, mais ça peut être bien pratique (ne serait-ce que pour avoir du code flexible qui s'appuie sur un fichier de config sans besoin de tout recompiler à chaque fois).
Je trouve personnellement le concept d'objet assez merveilleux en terme d'organisation propre du code. Ça permet de poser des limites assez claire entre quel bout de code fait quoi, là où une approche par fonction manque de hiérarchie (c'est mon point de vue en tout cas).
Après, pour des projets persos où le code est très spécialisé et unique, ça n'est pas forcément nécessaire, mais pour réutiliser du code interprojets, c'est super pratique. (il y aurait sûrement moyen de faire la même chose avec des fonctions, mais ... l'objet, c'est beau ! :P )
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#479 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 20 juillet 2017 - 06:43

Salut,

 

Je trouve personnellement le concept d'objet assez merveilleux en terme d'organisation propre du code. Ça permet de poser des limites assez claire entre quel bout de code fait quoi, là où une approche par fonction manque de hiérarchie (c'est mon point de vue en tout cas).

Peut être que tu voulais dire la même chose, mais pour moi le très gros avantage de la programmation orientée objet, ça reste le polymorphisme (qui découle de la notion d'héritage), le reste c'est du plus (dont la hiérarchisation qui oblige à couper son code).

Le polymorphisme, quand bien géré c'est quand même très puissant.

En un mot, le polymorphisme permet de faire de la résolution dynamique de fonction (la phase de link ou édition de lien lors de la compil), contrairement à une résolution statique qui est faite lors de la compilation. Ca permet une souplesse qu'il est parfois compliquée d'avoir en C.



#480 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 06 août 2017 - 02:42

Plop les maker's, devinez quoi, j'essaye de trouver la "librarie" officiel avec les exemples les plus simple pour faire fonctionner mes servos en C++, et devinez quoi, je ne tombe que sur du code Python, c'est le comble tout de même, et plusieurs mois auparavant c'était l'inverse :'(

 

Donc, pour gagner un peu de temps, quelqu'un as t'il un bout de code et un lien pour que je puisse voir tous ça, svp.

 

(j'avoue que depuis quelques temps suis un peu largué, déjà que j'avais du mal mais là, c'est retour case départ).

 

Merci 


signature_01.png -->

 

Mon Tipeee
 





2 utilisateur(s) li(sen)t ce sujet

0 members, 2 guests, 0 anonymous users