Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1244 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

Erreur: undefined reference to `seek' (Modification fichier bmp)

n°1630634
xilebo
noone
Posté le 25-10-2007 à 09:01:25  profilanswer
 

Reprise du message précédent :
sa taille est parfaitement définie :  
 
unsigned char header[10] fait 10 octets.
unsigned char info_header[40] fait 40 octets.
unsigned char **data est un pointeur , il fait donc la taille d'une adresse sur ta machine (généralement 4 octets).

mood
Publicité
Posté le 25-10-2007 à 09:01:25  profilanswer
 

n°1630649
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-10-2007 à 09:23:14  profilanswer
 

xilebo a écrit :

Erreur, il ne faut jamais retourner une variable locale à une fonction,


Tu parles bien sûr de" l'adresse d'une variable locale"...
 
Je reformule : "il ne faut jamais retourner l'adresse d'une variable locale"


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1630688
xilebo
noone
Posté le 25-10-2007 à 09:58:53  profilanswer
 

Emmanuel Delahaye a écrit :


Tu parles bien sûr de" l'adresse d'une variable locale"...
 
Je reformule : "il ne faut jamais retourner l'adresse d'une variable locale"


Oui toutes mes excuses :jap:

n°1630852
matafan
Posté le 25-10-2007 à 12:49:44  profilanswer
 

Sauf à la limite si elle est "static".

n°1630869
ngkreator
Posté le 25-10-2007 à 13:37:33  profilanswer
 

Ah donc mes doutes sont confirmés. Merci pour le sizeof(struct) ça m'a bien aidé. Donc maintenant je vais pouvoir écrire ma fonction qui rend l'image négative.
 
Voilà où j'en suis:
 
main.c
bmp.c
bmp.h
calcul.c
calcul.h
 
Main.c
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "bmp.h"
  5. #include "calcul.h"
  6. int main(int argc, char *argv[])
  7. {
  8.     t_bmp *image=NULL;
  9.     int i;
  10.     char* nomFichier;
  11.     t_couleur couleur;
  12.     //Chargement du fichier donné en 1er argument
  13.     if(argc==2)
  14.     {
  15.         strcpy(nomFichier,argv[1]);
  16.         image=charger_image_bmp(nomFichier);
  17.     }
  18.     //Affichage des données du fichier
  19.     if(image!=NULL)
  20.     {
  21.         puts("Affichage des donnes du fichier:\n\n" );
  22.         puts("Header-------------\n" );
  23.         for(i=0;i<14;i++
  24.             printf("%x ",image->header[i];
  25.         puts("\n\nInfo_Header-------------\n" );
  26.         for(i=0;i<40;i++)
  27.             printf("%x ",image->info_header[i]);
  28.         puts("\n\nData-------------\n" );
  29.         for(i=0;i<40;i++)
  30.             printf("%x ",image->data[0][i]);
  31.         puts("" );
  32.         printf("Taille: %dKo\n",valeur(image->header,2,4)/1024);
  33.         printf("Largeur: %d\n",valeur(image->info_header,4,4));
  34.         printf("Hauteur: %d\n",valeur(image->info_header,8,4));
  35.         couleur=couleurPixel_bmp(image,1,1);
  36.         printf("Couleur pixel: %d %d %d\n",couleur.rouge,couleur.bleu,couleur.vert);
  37.     }
  38.     return EXIT_SUCCESS;
  39. }


 
bmp.c
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "bmp.h"
  4. #include "calcul.h"
  5. t_bmp *charger_image_bmp(char *nomFichier)
  6. {
  7.     FILE* fichier_bmp;
  8.     t_bmp *struct_bmp;
  9.     int largeur, hauteur;
  10.     int nb_ligne_data, nb_octet_ligne_data, nb_octet_data;
  11.     int i,j,resultat;
  12.     short int format;
  13.     //Ouverture et Vérification du format bmp-------------------------
  14.     fichier_bmp=fopen(nomFichier,"r+" );
  15.     if(fichier_bmp==NULL)
  16.     {
  17.         puts("Fichier introuvable." );
  18.         return NULL;
  19.     }
  20.     fseek(fichier_bmp,0,SEEK_SET);
  21.     resultat=fread(&format,sizeof(short int),1,fichier_bmp);
  22.     if(resultat!=1)
  23.     {
  24.         puts("Erreur de lecture dans le fichier bmp.1" );
  25.         return NULL;
  26.     }
  27.     if(format!=19778)
  28.     {
  29.         puts("Le fichier n'est pas une image bmp valide.2" );
  30.         return NULL;
  31.     }
  32.     fseek(fichier_bmp,0,SEEK_SET);
  33.     struct_bmp=malloc(sizeof(t_bmp));
  34.     if(struct_bmp==NULL)
  35.     {
  36.         puts("Erreur allocation memoire" );
  37.         return NULL;
  38.     }
  39.     //Lecture de header----------------------------------
  40.     for(i=0;i<14&&!feof(fichier_bmp);i++)
  41.     {
  42.         struct_bmp->header[i]=fgetc(fichier_bmp);
  43.     }
  44.     if(i<14)
  45.     {
  46.         puts("Le fichier n'est pas une image bmp valide.3" );
  47.         return NULL;
  48.     }
  49.     //Lecture de info_header-----------------------------
  50.     for(i=0;i<40&&!feof(fichier_bmp);i++)
  51.         struct_bmp->info_header[i]=fgetc(fichier_bmp);
  52.     if(i<40)
  53.     {
  54.         puts("Le fichier n'est pas une image bmp valide.4" );
  55.         return NULL;
  56.     }
  57.     //Lecture de data (données pixels)--------------------
  58.     largeur = hauteur=0;
  59.     for(i=0;i<4;i++)//A remplacer par une fonction
  60.     {
  61.         largeur+=puiss2(8*i)*struct_bmp->info_header[i+4];
  62.         hauteur+=puiss2(8*i)*struct_bmp->info_header[i+8];
  63.     }
  64.     nb_ligne_data = hauteur;
  65.     nb_octet_ligne_data = 3*largeur;
  66.     if(nb_octet_ligne_data%4!=0)
  67.         nb_octet_ligne_data += 4-nb_octet_ligne_data%4;
  68.     nb_octet_data = nb_ligne_data*nb_octet_ligne_data;
  69.     struct_bmp->data=malloc(nb_ligne_data*sizeof(unsigned char*));
  70.     if(struct_bmp->data==NULL)
  71.         return NULL;
  72.     for(i=0;i<nb_ligne_data;i++)
  73.     {
  74.         struct_bmp->data[i]=malloc(nb_octet_ligne_data*sizeof(unsigned char));
  75.         if(struct_bmp->data[i]==NULL)
  76.         {
  77.             puts("Erreur allocation memoire" );
  78.             return NULL;
  79.         }
  80.     }
  81.     for(i=0;i<nb_ligne_data&&!feof(fichier_bmp);i++)
  82.         for(j=0;j<nb_octet_ligne_data&&!feof(fichier_bmp);j++)
  83.             struct_bmp->data[i][j]=fgetc(fichier_bmp);
  84.       if(i<nb_ligne_data||j<nb_octet_ligne_data)
  85.       {
  86.           puts("Le fichier n'est pas une image bmp valide.5" );
  87.           return NULL;
  88.       }
  89.     printf("Le fichier %s a ete charge correctement\n\n",nomFichier);
  90.     return struct_bmp;
  91. }
  92. t_couleur RVB(unsigned char r, unsigned char v, unsigned char b)
  93. {
  94.     t_couleur couleur;
  95.     couleur.rouge = r;
  96.     couleur.vert = v;
  97.     couleur.bleu = b;
  98.     return couleur;
  99. }
  100. t_couleur couleurPixel_bmp(t_bmp *struct_bmp,int x, int y)
  101. {
  102.     t_couleur couleurPixel;
  103.     couleurPixel.bleu=struct_bmp->data[y-1][(x-1)*3];
  104.     couleurPixel.vert=struct_bmp->data[y-1][(x-1)*3+1];
  105.     couleurPixel.rouge=struct_bmp->data[y-1][(x-1)*3+1];
  106.     return couleurPixel;
  107. }


 
 
calcul.c

Code :
  1. #include <stdio.h>
  2. #include "calcul.h"
  3. int puiss2(int puissance)
  4. {
  5.     if(puissance>0)
  6.         return 2*puiss2(puissance-1);
  7.     else
  8.         return 1;
  9. }
  10. int valeur(unsigned char *tab,int debut, int nbOctet)
  11. {
  12.     int i,valeur=0;
  13.     for(i=0;i<nbOctet;i++)
  14.         valeur+=tab[debut+i]*puiss2(8*i);
  15.     return valeur;
  16. }


Message édité par ngkreator le 25-10-2007 à 13:50:02
n°1631171
tpierron
Posté le 25-10-2007 à 18:18:00  profilanswer
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     t_bmp *image=NULL;
  4.     int i;
  5.     char* nomFichier;
  6.     t_couleur couleur;
  7.     //Chargement du fichier donné en 1er argument
  8.     if(argc==2)
  9.     {
  10.         strcpy(nomFichier,argv[1]);


 
Ça commence mal  :sweat:  ....

n°1631189
ngkreator
Posté le 25-10-2007 à 18:44:33  profilanswer
 

tpierron a écrit :

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     t_bmp *image=NULL;
  4.     int i;
  5.     char* nomFichier;
  6.     t_couleur couleur;
  7.     //Chargement du fichier donné en 1er argument
  8.     if(argc==2)
  9.     {
  10.         strcpy(nomFichier,argv[1]);


 
Ça commence mal  :sweat:  ....


Ah bonne nouvelle je vais apprendre encore un truc alors. Mais c'est quoi qui cloche? La manière dont j'utilise argv?

n°1631192
Taz
bisounours-codeur
Posté le 25-10-2007 à 18:47:35  profilanswer
 

ngkreator a écrit :


Ah bonne nouvelle je vais apprendre encore un truc alors. Mais c'est quoi qui cloche? La manière dont j'utilise argv?


ta manière de lire ton manuel de C

n°1631197
ngkreator
Posté le 25-10-2007 à 18:55:19  profilanswer
 

Taz a écrit :


ta manière de lire ton manuel de C


Ah oui j'ai un peu oublié d'allouer de la mémoire à un certain pointeur [:cupra] En espérant que ça soit ça.
 
Edit: d'ailleur il a du sauter à un moment donné dans les copier/coller parce que le programme plante (normal) alors qu'avant non.


Message édité par ngkreator le 25-10-2007 à 18:59:38
n°1631199
xilebo
noone
Posté le 25-10-2007 à 18:58:38  profilanswer
 

ngkreator a écrit :


Ah bonne nouvelle je vais apprendre encore un truc alors. Mais c'est quoi qui cloche? La manière dont j'utilise argv?


"char *nomFichier", c'est juste un pointeur sur un char. Or, tu fais après "strcpy(nomFichier,argv[1])" . Cela va provoquer une erreur car tu essaies de copier argv[1] dans un truc pas initialisé.
 
Soit tu crées un tableau de caractères, ou soit tu utilises la fonction strdup
 

Code :
  1. char nomFichier[256];
  2. ...
  3. ...
  4. strncpy(nomFichier,argv[1],255); // strncpy sécurise et evite un depassement de tableau au cas ou argv[1] > 255


 
ou bien
 

Code :
  1. char *nomFichier;
  2. ...
  3. ...
  4. nomFichier=strdup(argv[1]);
  5. ....
  6. // ne pas oublier la libération du pointeur
  7. free(nomFichier);

mood
Publicité
Posté le 25-10-2007 à 18:58:38  profilanswer
 

n°1631201
ngkreator
Posté le 25-10-2007 à 19:04:18  profilanswer
 

Oui merci donc c'est bien ça :jap:  Je connaissais pas la fonction strup, pratique!
 
La libération aussi j'y avais pas pensé merci.
 
D'ailleur pourquoi est-ce qu'on doit libérer un pointeur? Quand le programme ferme il windows ne peut plus accéder à l'espace mémoire pointé si on ne le libère pas?

Message cité 1 fois
Message édité par ngkreator le 25-10-2007 à 20:04:00
n°1631212
xilebo
noone
Posté le 25-10-2007 à 19:44:08  profilanswer
 

Lorsqu'on alloue de la mémoire dynamique avec malloc(), il faut la libérer systématiquement avec free() dès qu'on n'en a plus besoin. Sinon, tu risques de saturer la mémoire de ton processus, ce qui se traduira par un échec systématique de tout nouveau appel à malloc().
 
Dans ton cas, ca n'a pas trop de conséquence car le programme est petit et de toutes facons, la mémoire est libérée à la terminaison du processus par un mécanisme du système, mais il faut prendre de bonnes habitudes dès le début.

n°1631226
ngkreator
Posté le 25-10-2007 à 20:11:27  profilanswer
 

Ah donc la mémoire est bien libéré à l'extinction du programme j'ai eu peur. Donc (par simple curiosité) il serait inutile de mettre un free() à la dernière ligne d'un programme, étant donné que la mémoire sera libérée?
 
Une autre question: j'ai vu que les adresses (pointeurs) et les valeurs de variables étaient enregistrées dans des registres du processeur. A quoi sert la mémoire vive alors?

Message cité 1 fois
Message édité par ngkreator le 25-10-2007 à 20:12:01
n°1631267
matafan
Posté le 25-10-2007 à 23:04:58  profilanswer
 

Il est "inutile" de libérer la mémoire à la fin du programe. Par contre par soucis d'économie il faut toujours libérer la mémoire dès que tu n'en a plus besoin et si tu n'es pas à la fin du programe.
 
Celà dit ça ne peut pas faire de mal de libérer la mémoire systématiquement, même en fin de programe. Tu as par exemple des outils qui te font un rapport de la mémoire non libérée, très utiles pour détecter les fuites mémoires. Mais si tu ne libères pas systématiquement toute la mémoire, tes vraies fuites seront noyées au milieu de ce que tu n'as volontairement pas libéré.

n°1631276
Taz
bisounours-codeur
Posté le 26-10-2007 à 00:20:39  profilanswer
 

utilisation bugguée de strncpy

n°1631302
xilebo
noone
Posté le 26-10-2007 à 08:24:08  profilanswer
 

Taz a écrit :

utilisation bugguée de strncpy


tu peux en dire un peu plus ?

n°1631382
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 10:26:43  profilanswer
 

ngkreator a écrit :

D'ailleur pourquoi est-ce qu'on doit libérer un pointeur?


Gné ? On ne 'libère pas un pointeur'. On libère l'espace alloué par malloc() dont l'adresse est stockée dans le pointeur... Nuance... Après, un free(p), le pointeur p n'est pas libéré. Par contre, la zone pointée est libérée et la valeur du pointeur est invalide. Je recommande de le forcer à NULL après libération du bloc associé :  

Code :
  1. free (p), p = NULL;


 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1631383
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 10:27:59  profilanswer
 

matafan a écrit :

Il est "inutile" de libérer la mémoire à la fin du programe. Par contre par soucis d'économie il faut toujours libérer la mémoire dès que tu n'en a plus besoin et si tu n'es pas à la fin du programe.
 
Celà dit ça ne peut pas faire de mal de libérer la mémoire systématiquement, même en fin de programe. Tu as par exemple des outils qui te font un rapport de la mémoire non libérée, très utiles pour détecter les fuites mémoires. Mais si tu ne libères pas systématiquement toute la mémoire, tes vraies fuites seront noyées au milieu de ce que tu n'as volontairement pas libéré.


+ 10


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1631384
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 10:28:41  profilanswer
 

xilebo a écrit :

tu peux en dire un peu plus ?


Je te conseille de lire en détail la spécification de strncpy().

 

http://www.cplusplus.com/reference [...] rncpy.html

 

Contrairement aux apparences, ce site est une excellente référence sur la bibliothèque C standard.

 


Message cité 1 fois
Message édité par Emmanuel Delahaye le 26-10-2007 à 10:29:45

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1631387
Taz
bisounours-codeur
Posté le 26-10-2007 à 10:49:56  profilanswer
 

xilebo a écrit :


tu peux en dire un peu plus ?


croise les doigts très fort pour que nomFichier[255] vale 0

n°1631508
ngkreator
Posté le 26-10-2007 à 12:17:11  profilanswer
 

Emmanuel Delahaye a écrit :


Gné ? On ne 'libère pas un pointeur'. On libère l'espace alloué par malloc() dont l'adresse est stockée dans le pointeur... Nuance... Après, un free(p), le pointeur p n'est pas libéré. Par contre, la zone pointée est libérée et la valeur du pointeur est invalide. Je recommande de le forcer à NULL après libération du bloc associé :  

Code :
  1. free (p), p = NULL;


 

Oui oui c'est ce que je voulais dire mais je trouvais ça plus court que de dire "libère l'espace alloué dont l'adresse du premier emplacement est stocké dans le pointeur" [:pingouino]
 

Emmanuel Delahaye a écrit :


Je te conseille de lire en détail la spécification de strncpy().
 
http://www.cplusplus.com/reference [...] rncpy.html
 
Contrairement aux apparences, ce site est une excellente référence sur la bibliothèque C standard.
 
 

En tout cas c'est celle que j'utilise car elle est très pratique et clair!
 

Taz a écrit :


croise les doigts très fort pour que nomFichier[255] vale 0


J'adore tes réponses implicites! Mais au moins ce que je pensais avoir compris d'après la doc est confirmé.

Message cité 1 fois
Message édité par ngkreator le 26-10-2007 à 12:36:26
n°1631529
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 12:38:17  profilanswer
 

ngkreator a écrit :

Oui oui c'est ce que je voulais dire mais je trouvais ça plus court que de dire "libère l'espace alloué dont l'adresse du premier emplacement est stocké dans le pointeur"


Indéniablement, c'est plus court, mais ce n'est pas correct pour autant. Il suffit de dire "si on libère l'espace alloué", ou, si on tient à se référer à un pointeur particulier : "si on libère l'espace pointé par .p_xxx". C'est pas très difficile d'écrire un texte correct qui montre que l'on a compris de quoi on parle...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1631533
ngkreator
Posté le 26-10-2007 à 12:41:52  profilanswer
 

Sous quelle forme sont enregistrés les caractères dans argv[0] argv[1]...
 
est-ce:
 
argv[0] <-> 'N','o','m','d','u','p','r','o','g','r','a','m','e','\0'
argv[1] <-> 'a','r','g','u','m','e','n','t','1','\0'
...
 
ou
 
argv[0] <-> 'N','o','m','d','u','p','r','o','g','r','a','m','e'
argv[1] <-> 'a','r','g','u','m','e','n','t','1'
...
 
 

Emmanuel Delahaye a écrit :


Indéniablement, c'est plus court, mais ce n'est pas correct pour autant. Il suffit de dire "si on libère l'espace alloué", ou, si on tient à se référer à un pointeur particulier : "si on libère l'espace pointé par .p_xxx". C'est pas très difficile d'écrire un texte correct qui montre que l'on a compris de quoi on parle...
 


Oui tu as raison  :jap:
 

ngkreator a écrit :

Ah donc la mémoire est bien libéré à l'extinction du programme j'ai eu peur. Donc (par simple curiosité) il serait inutile de mettre un free() à la dernière ligne d'un programme, étant donné que la mémoire sera libérée?
 
Une autre question: j'ai vu que les adresses (pointeurs) et les valeurs de variables étaient enregistrées dans des registres du processeur. A quoi sert la mémoire vive alors?


Je réitère ma question, à quoi sert la mémoire vive?

Message cité 2 fois
Message édité par ngkreator le 26-10-2007 à 12:46:00
n°1631534
Taz
bisounours-codeur
Posté le 26-10-2007 à 12:45:50  profilanswer
 

ngkreator a écrit :

Sous quelle forme sont enregistrés les caractères dans argv[0] argv[1]...
 
est-ce:
 
argv[0] <-> 'N','o','m','d','u','p','r','o','g','r','a','m','e','\0'
argv[1] <-> 'a','r','g','u','m','e','n','t','1','\0'
...
 
ou
 
argv[0] <-> 'N','o','m','d','u','p','r','o','g','r','a','m','e'
argv[1] <-> 'a','r','g','u','m','e','n','t','1'
...
 
 


[/quotemsg]T'as pas l'impression que la deuxième serait inutilisable ?

n°1631535
matafan
Posté le 26-10-2007 à 12:47:26  profilanswer
 

Chaque chaine est terminée par '\0' dans les argv[i] (ta première proposition, donc).

n°1631538
ngkreator
Posté le 26-10-2007 à 12:55:06  profilanswer
 

T'as pas l'impression que la deuxième serait inutilisable ?
Non effectivement.
 

matafan a écrit :

Chaque chaine est terminée par '\0' dans les argv[i] (ta première proposition, donc).

ok
 
Donc je me dis qu'on peut plutôt utiliser:
 

Code :
  1. char nomFichier[255];
  2. strcpy(nomFichier,argv[1]);


 
Comme ça strcpy recopie tout argv[1] dans nomFichier, mais si il y a plus de 254 caractères (sans le null) dans argv[1] problème.
 
Donc je mettrais:
 

Code :
  1. char nomFichier[255];
  2. strncpy(nomFichier,argv[1],254);
  3. nomFichier[254]=0; ou '\0'


 
 
 

n°1631540
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 12:56:23  profilanswer
 

ngkreator a écrit :

Je réitère ma question, à quoi sert la mémoire vive?


A implémenter les 3 zones mémoires du C (automatique, statique, allouée). Eventuellement, ça sert aussi à implémenter la zone exécutable.
 
Il est possible que certaines variables automatiques soient implémentées par des registres, mais c'est rare et anecdotique (le nombre de registres est limité).


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1631542
Elmoricq
Modérateur
Posté le 26-10-2007 à 12:56:53  profilanswer
 

char nomFichier[FILENAME_MAX];
snprintf(nomFichier, FILENAME_MAX, "%s", argv[1]);

n°1631543
Taz
bisounours-codeur
Posté le 26-10-2007 à 12:56:54  profilanswer
 

Sinon un simple

Code :
  1. const char * username = argv[1];

ça peut le faire ...

n°1631545
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 12:59:00  profilanswer
 

ngkreator a écrit :

Donc je mettrais:

Code :
  1. char nomFichier[255];
  2. strncpy(nomFichier,argv[1],254);
  3. nomFichier[254]=0; ou '\0'




Oui, ce que je trouve un peu compliqué. Personnellement, je fais :  

Code :
  1. char nomFichier[255];
  2.    *nomFichier = 0;
  3.    strncat(nomFichier, argv[1], sizeof nomFichier - 1);



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1631546
ngkreator
Posté le 26-10-2007 à 12:59:22  profilanswer
 

Emmanuel Delahaye a écrit :


A implémenter les 3 zones mémoires du C (automatique, statique, allouée). Eventuellement, ça sert aussi à implémenter la zone exécutable.
 
Il est possible que certaines variables automatiques soient implémentées par des registres, mais c'est rare et anecdotique (le nombre de registres est limité).


Bon il me manque des notions là (zones mémoire, variables automatiques...), je vais me documenter.

n°1631549
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 13:00:52  profilanswer
 

ngkreator a écrit :

Bon il me manque des notions là (zones mémoire, variables automatiques...), je vais me documenter.


http://mapage.noos.fr/emdel/notes.htm#donnees


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1631550
ngkreator
Posté le 26-10-2007 à 13:01:38  profilanswer
 

Elmoricq a écrit :

char nomFichier[FILENAME_MAX];
snprintf(nomFichier, FILENAME_MAX, "%s", argv[1]);


 

Taz a écrit :

Sinon un simple

Code :
  1. const char * username = argv[1];

ça peut le faire ...


Ah oui plus court :D

Emmanuel Delahaye a écrit :


Oui, ce que je trouve un peu compliqué. Personnellement, je fais :  

Code :
  1. char nomFichier[255];
  2.    *nomFichier = 0;
  3.    strncat(nomFichier, argv[1], sizeof nomFichier - 1);




Il y a donc plusieurs solutions, merci à vous tous.
 


Merci en plus je l'avais dans mes favoris.
 
Une autre question:
 
Si je déclare:
 

Code :
  1. typedef struct{
  2.     int a[1];
  3.     int b[1];
  4. }structure;


 
Est-ce que structure.a+1=structure.b? Autrement dit, est-ce que tous les éléments d'une structure sont placés à la suite en mémoire?

Message cité 2 fois
Message édité par ngkreator le 26-10-2007 à 13:08:16
n°1631554
matafan
Posté le 26-10-2007 à 13:11:05  profilanswer
 

ngkreator a écrit :

Si je déclare:
 

Code :
  1. typedef struct{
  2.     int a[1];
  3.     int b[1];
  4. }structure;


 
Est-ce que structure.a+1=structure.b? Autrement dit, est-ce que tous les éléments d'une structure sont placés à la suite en mémoire?


Dans ce cas précis probablement, mais ce n'est pas garenti à part si tu demande à ton compilo de "packer" les structures.

n°1631561
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 13:19:39  profilanswer
 

ngkreator a écrit :


Ah oui plus court :D


Attention, n'est valide que si on ne modifie pas le paramètre (ce qui est généralement le cas).
 

ngkreator a écrit :


Une autre question:
 
Si je déclare définis :
 

Code :
  1. typedef struct{
  2.     int a[1];
  3.     int b[1];
  4. }structure;


 
Est-ce que structure.a+1=structure.b? Autrement dit, est-ce que tous les éléments d'une structure sont placés à la suite en mémoire?


2 choses sont garanties par le langage .
 

  • L'adresse de la structure, de a et de a[0] sont identiques
  • L'élément b est situé après l'élément a.


Par contre, rien ne garanti que les éléments soient 'collés'. Il peut y avoir des 'trous' (bytes de 'bourrage' ou padding bytes).
 
Si ton intention est de créer une structure pour réaliser une interface avec les données d'un fichier, sache que c'est techniquement possible (Microsoft le fait), mais que ce n'est pas portable.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1631628
Taz
bisounours-codeur
Posté le 26-10-2007 à 14:08:26  profilanswer
 

Emmanuel Delahaye a écrit :


Attention, n'est valide que si on ne modifie pas le paramètre (ce qui est généralement le cas).


Il me semblait que c'était un peu la connotation de const.

n°1631643
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2007 à 14:19:54  profilanswer
 

Taz a écrit :


Il me semblait que c'était un peu la connotation de const.


Oui, bien sûr, mais avec les débutants, deux précautions valent mieux qu'une...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1643056
ngkreator
Posté le 14-11-2007 à 21:39:54  profilanswer
 

Depuis mon dernier post je bute contre un problème: la fin du fichier est atteinte trop tôt. Ca se passe lors du remplissage d'une matrice à 2 dimentions qui représente les données pixels.
 

Code :
  1. fseek(fichier_bmp,54,SEEK_SET);
  2.     for(i=0;i<nb_ligne_data&&!feof(fichier_bmp);i++)
  3.         for(j=0;j<nb_octet_ligne_data&&!feof(fichier_bmp);j++)
  4.                 struct_bmp->data[i][j]=fgetc(fichier_bmp);


Je remets la définition de struct_bmp:

Code :
  1. typedef struct
  2. {
  3.     unsigned char header[14];
  4.     unsigned char info_header[40];
  5.     unsigned char RGBquad[4];
  6.     unsigned char **data;
  7. }
  8. t_bmp;


 
Si j'enlève les feof():
 
En fait ma matrice struct_bmp.data[i][j]  est remplie avec les bonnes valeurs jusqu'a la xème position. A partir de la xème position elle est remplie de 255. Plus l'image à charger est grande plus x est grand. On dirait que ça s'arrête à un certain pourcentage qui est toujours le même (j'ai pas vérifié).
 
Quand la fin du fichier est atteinte, fgetc renvoie la constante EOF dont je ne connais pas la valeur. Apparemment ici ça se traduit par un 255 dans mes unsigned char.
 
J'ai vérifié la valeur de feof quand j'obtiens des 255, et il prend une valeur non nulle. J'ai donc bien atteint la fin du fichier.
 
Sans contexte impossible de comprendre d'où vient l'erreur donc je mais la fonction dans laquelle le problème se pose: la boucle problématique est située à la ligne 53.
 

Code :
  1. t_bmp *charger_image_bmp(char *nomFichier)
  2. {
  3.     FILE* fichier_bmp;
  4.     t_bmp *struct_bmp;
  5.     int largeur, hauteur;
  6.     int nb_ligne_data, nb_octet_ligne_data;
  7.     int i,j,resultat;
  8.     short int format;
  9.     //Ouverture et Vérification du format bmp-----------------------------------
  10.     fichier_bmp=fopen(nomFichier,"r+" );
  11.     if(fichier_bmp==NULL){puts("Fichier introuvable." );return NULL;}
  12.     fseek(fichier_bmp,0,SEEK_SET);
  13.     resultat=fread(&format,sizeof(short int),1,fichier_bmp);
  14.     if(resultat!=1){puts("Erreur de lecture dans le fichier bmp.1" );return NULL;}
  15.     if(format!=19778){puts("Le fichier n'est pas une image bmp valide.2" );return NULL;}
  16.     //Initialisation de la structure bmp----------------------------------------
  17.     struct_bmp=malloc(sizeof(t_bmp));
  18.     if(struct_bmp==NULL){puts("Erreur allocation memoire" );return NULL;}
  19.     //Lecture de header---------------------------------------------------------
  20.     fseek(fichier_bmp,0,SEEK_SET);
  21.     for(i=0;i<14&&!feof(fichier_bmp);i++) struct_bmp->header[i]=fgetc(fichier_bmp);
  22.     if(i<14){puts("Le fichier n'est pas une image bmp valide.3" );return NULL;}
  23.     //Lecture de info_header
  24.     for(i=0;i<40&&!feof(fichier_bmp);i++) struct_bmp->info_header[i]=fgetc(fichier_bmp);
  25.     if(i<40){puts("Le fichier n'est pas une image bmp valide.4" );return NULL;}
  26.     //Lecture de data (données pixels)------------------------------------------
  27.     largeur = largeurPixel_bmp(struct_bmp);
  28.     hauteur = hauteurPixel_bmp(struct_bmp);
  29.     nb_ligne_data = hauteur;
  30.     nb_octet_ligne_data = 3*largeur;
  31.     if(nb_octet_ligne_data%4!=0)
  32.         nb_octet_ligne_data += 4-nb_octet_ligne_data%4;
  33.     struct_bmp->data=malloc(nb_ligne_data*sizeof(unsigned char*));
  34.     if(struct_bmp->data==NULL) return NULL;
  35.     for(i=0;i<nb_ligne_data;i++)
  36.     {
  37.         struct_bmp->data[i]=malloc(nb_octet_ligne_data*sizeof(unsigned char));
  38.         if(struct_bmp->data[i]==NULL){puts("Erreur allocation memoire" );return NULL;}
  39.     }
  40.     fseek(fichier_bmp,54,SEEK_SET);
  41.     for(i=0;i<nb_ligne_data&&!feof(fichier_bmp);i++)
  42.         for(j=0;j<nb_octet_ligne_data&&!feof(fichier_bmp);j++)
  43.                 struct_bmp->data[i][j]=fgetc(fichier_bmp);
  44.     if(i<nb_ligne_data||j<nb_octet_ligne_data) {puts("\nFin du fichier atteinte" ); return NULL;}
  45.     fclose(fichier_bmp);
  46.     printf("Le fichier %s a ete charge correctement\n\n",nomFichier);
  47.     return struct_bmp;
  48. }


Message édité par ngkreator le 14-11-2007 à 21:51:20
n°1643080
Ace17
Posté le 14-11-2007 à 22:33:34  profilanswer
 

Code :
  1. fichier_bmp=fopen(nomFichier,"rb+" );

n°1643083
ngkreator
Posté le 14-11-2007 à 22:39:22  profilanswer
 

Ace17 a écrit :

Code :
  1. fichier_bmp=fopen(nomFichier,"rb+" );



Bravo! Ca marche [:mlc]  Je bloquais depuis plusieurs semaines! Un grand merci encore une fois.
 
Quelle est la différence entre un fichier texte et un fichier binaire?

Message cité 1 fois
Message édité par ngkreator le 14-11-2007 à 22:40:08
n°1643314
ngkreator
Posté le 15-11-2007 à 12:27:46  profilanswer
 

Ca y est ça marche après quelques problèmes encore à régler j'arrive à obtenir des négatifs parfaits, et des miroirs. Maintenant je vais m'attaquer aux rotations [:totoz]
 
En fait il me semble qu'en algèbre on pouvait utiliser des matrices de rotation je vais chercher de ce coté là...
 
Oulà c'est plus cho que ce que je pensais. Je me demande même si le redimensionnement n'est pas plus simple. En tous cas je vais pas m'ennuyer.


Message édité par ngkreator le 15-11-2007 à 12:41:43
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
Erreur de GD library je pense[PHP] Importer un fichier XML dans base MYSQL
Include un fichier php dans un different site sur le meme serveurfichier *.HTA, autodétection de la lettre du lecteur cd
Nom de fichier au téléchargementPB de download de fichier sur serveur distant.
[Résolu][SH-Sed] Supprimer une partie d'un fichierMauvaise manipe = comment supprimer un fichier ?
Supression caractères dans nom fichier 
Plus de sujets relatifs à : Erreur: undefined reference to `seek' (Modification fichier bmp)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR