IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Déplacement d'un pic


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut Déplacement d'un pic
    Bonjour tout le monde,

    Je voudrais centré une lettre E en fonction de la position du pic de corrélation:
    Mais il y a ,un problème dans la compilation que je le vois pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     #include  "math.h"
       #include  "conio.h"
       #include  "stdio.h"
       #include  "stdlib.h"
       #include  "alloc.h"
     
     
     
    main()
      {
          long int n2,kk,k,ll,ii,jj,nn,coorx,coory; 
          int dim,i;
          char arch0[30], arch1[30]
          float  huge *ct, huge *cr;
          float vmax;
     
          printf("\n\ dimension du fichier:");
          scanf("%d",&dim);
          n2 = (long)dim * (long)dim ;
          ct = farcalloc(n2,4);
          cr = farcalloc(n2,4);
     
          if ( cr == NULL || ct == NULL ) { printf ( "\n Memory error."); exit(0); }
     
          printf("\n\n Introduire Cross-correlation matrice:");
          scanf("%s",&arch0);
          i=disco(arch0,dim,dim,1,cr,4);
          if (i!=1) goto fin;
     
          printf("\n\n Introduire la matrice a translat‚:");
          scanf("%s",&arch1);
          i=disco(arch1,dim,dim,1,ct,4);
          if (i!=1) goto fin;
     
          vmax=cr[0];
          for (ii=0; ii < dim; ii++)
           {
    	   ll =(long)dim * (long)ii;
    	   for (jj=0; jj < dim; jj++)
    	   {
    	   nn=ll+jj;
    	   if( cr[nn] > vmax )
    	       {
    	       vmax = cr[nn];
    	       coorx = ii;
    	       coory = jj;
    	       }
    	   }
    	}
     
    	for ( kk=0 ; kk < n2 ; kk++)
    	    {
    	     cr[kk] = 0;
    	    }
    	 coorx = coorx - dim/2;
    	 coory = coory - dim/2;
     
     
     
           for (ii=abs(coorx); ii < dim-abs(coorx); ii++)
    	   {
    	   ll =(long)dim * (long)ii;
    	   for (jj=abs(coory); jj < dim-abs(coory); jj++)
    	     {
    	    cr[(long)dim*(ii-coorx)+jj-coory]= ct[(long)dim * (long)ii+jj];
    	     }
     
    	    }
     
          printf("\n\nIntroduire le nom de la matrice centr‚:");
          scanf("%s",&arch1);
          i=disco(arch1,dim,dim,2,cr,4);
          if (i!=1) goto fin;
     
    fin:
    farfree(cr);
    farfree(ct);
    return(0);
    }

    Merci d'avance

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Votre code est specifique a Windows (conio.h), et il manque des fonctions pour que l'on puisse le compiler, comme farcalloc, disco, farfree.

    Quelques remarques sur le code :
    Le prototype de main est int main (void), ou int main (int argc, char ** argv).
    scanf n'est pas une bonne maniere pour lire les entrees clavier.
    Pourquoi utiliser des goto, alors que ce n'est pas necessaire ?
    Vous faites des calculs, mais ne les affichez ni ne les retourner... A moins que ce ne soit dans disco ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    Ce programme et d'autres sont donnés par mon encadrant de PFE,c'est pour cela que je trouve des difficultés de les comprendre.et je suis obligé de travailler avec ces derniers.
    Donc si possible vous pouvez me donner votre Email pour que je t'envoie l'ensemble des programmes et on discute à propos de l'objectif recherché.

    Merci

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    Bonsoir,
    Mon programme se bloque ici:i=disco(arch0,dim,dim,1,cr,4);

    Avec cet erreur:
    cannot convert `float*' to `char*' for argument `5' to `int disco(char*, int, int, int, char*, int)'

    Je dois utiliser char*,dans le paramètre 5,tandis que j'ai la variable cr comme float*.

    Est ce qu'il y a une solution pour que je garde char* et en même temps prendre l'information qui arrive de float.sinon comment je ferai pour résoudre cet erreur?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    #include  
    <math.h>
       #include  <stdio.h>
       #include  <stdlib.h>
     
    int disco  (char fichero[], int nfil, int ncol, int control,char *a, int tipo);
    int main(void)
      {
          long int n2,kk,k,ll,ii,jj,nn,coorx,coory; 
          int dim,i;
          char arch0[30], arch1[30];
          float  *ct,*cr;
          float vmax;
     
          printf("\n\ dimension du fichier:");
          scanf("%d",&dim);
          n2 = (long)dim * (long)dim ;
     
          ct = (float*)calloc(n2, sizeof(float));
          cr = (float*)calloc(n2, sizeof(float));
     
          if ( cr == NULL || ct == NULL ) { printf ( "\n Memory error."); exit(0); }
     
          printf("\n\n Introduire Cross-correlation matrice:");
          scanf("%s",arch0);
     
     
     
     
     
          i=disco(arch0,dim,dim,1,cr,4);
          if (i!=1) goto fin;
     
          printf("\n\n Introduire la matrice a translat‚:");
          scanf("%s",arch1);
          i=disco(arch1,dim,dim,1,ct,4);
          if (i!=1) goto fin;
     
          vmax=cr[0];
          for (ii=0; ii < dim; ii++)
           {
    	   ll =(long)dim * (long)ii;
    	   for (jj=0; jj < dim; jj++)
    	   {
    	   nn=ll+jj;
    	   if( cr[nn] > vmax )
    	       {
    	       vmax = cr[nn];
    	       coorx = ii;
    	       coory = jj;
    	       }
    	   }
    	}
     
    	for ( kk=0 ; kk < n2 ; kk++)
    	    {
    	     cr[kk] = 0;
    	    }
    	 coorx = coorx - dim/2;
    	 coory = coory - dim/2;
     
     
     
           for (ii=abs(coorx); ii < dim-abs(coorx); ii++)
    	   {
    	   ll =(long)dim * (long)ii;
    	   for (jj=abs(coory); jj < dim-abs(coory); jj++)
    	     {
    	    cr[(long)dim*(ii-coorx)+jj-coory]= ct[(long)dim * (long)ii+jj];
    	     }
     
    	    }
     
          printf("\n\nIntroduire le nom de la matrice centr‚:");
          scanf("%s",arch1);
          i=disco(arch1,dim,dim,2,cr,4);
          if (i!=1) goto fin;
     
    fin:
    free(cr);
    free(ct);
    return 0 ;
    }
     
     /*********************************************************************\
     *                                                                     *
     *                                                                     *
     *                            DISCO.C                                  *
     *                            =======                                  *
     *                                                                     *
     *         Rutina para trasladar n£meros de cualquier tipo desde       *
     *         una  variable  de la memoria a un disco o de un disco       *
     *         a una variable de la memoria.                               *
     *                                                                     *
     *                          ---------                                  *
     *                                                                     *
     *      Par metros:                                                    *
     *                                                                     *
     *      fichero         -  Nombre del fichero del disco.               *
     *      nfil, ncol      -  N£mero de filas y columnas.                 *
     *      control         -  1 para leer del fichero.                    *
     *                         2 para grabar en el fichero.                *
     *      a               -  puntero que indica la variable.             *
     *      tipo            -  n§ de bytes por elemento de la variable.    *
     *                                                                     *
     *                                                                     *
     \*********************************************************************/
     
     
    int disco  (char fichero[], int nfil, int ncol, int control,char *a, int tipo)
     
    {
            long int n, cont, ng;
            int unidad, j, cociente, resto;
     
            if (control == 1)  {
                    if ((unidad = open (fichero,1))  == -1)  {
                            return (-1);
                    }
                    cont = (long) nfil * (long) ncol * tipo;
                    resto = cont % 32768;
                    cociente = cont / 32768;
                    for (j = 0, n = 0; j < cociente; j++,n += 32768)
                            _read (unidad, &a[n], 32768);
                    _read (unidad, &a[n], resto);
                    close (unidad);
                    return 1;
            }
            if (control == 2)  {
                    if ((unidad = creat (fichero, 200))  == -1)  {
                            return -1;
                    }
                    cont = (long) nfil * (long) ncol * tipo;
                    resto = cont % 32768;
                    cociente = cont / 32768;
                    ng = 0;
                    for (j = 0, n = 0; j < cociente; j++, n += 32768)
                         ng = ng + (unsigned) _write (unidad, &a[n], 32768);
                    ng = ng + (unsigned) _write (unidad, &a[n], resto);
                    if (ng != cont)   {
                            return 0;
                    }
     
                    close (unidad);
                    return 1;
            }
            return 0;
    }

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nomadstorm Voir le message
    Bonsoir,
    Mon programme se bloque ici:i=disco(arch0,dim,dim,1,cr,4);

    Avec cet erreur:
    cannot convert `float*' to `char*' for argument `5' to `int disco(char*, int, int, int, char*, int)'

    Je dois utiliser char*,dans le paramètre 5,tandis que j'ai la variable cr comme float*.

    Est ce qu'il y a une solution pour que je garde char* et en même temps prendre l'information qui arrive de float.sinon comment je ferai pour résoudre cet erreur?
    Salut
    Il faut bien comprendre que si une fonction a besoin de l'adresse d'un char, il est malvenu de lui filer l'adresse d'un float. Meme si on arrive à la tromper via un cast, il y a de grandes chances qu'elle parte alors totalement à l'ouest.

    Toutefois j'ai regardé le code de disco(). Le 5° paramètre est stocké dans un char *a qui est ensuite utilisé comme (semble-t-il) pointeur universel. Bref une méthode un peu périmée remplacée depuis par le void*.
    Donc (sous réserve que j'ai bien analysé le truc), tu peux forcer la main en castant cr pour le transformer en adresse de char
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    i=disco(arch0,dim,dim,1,(char*)cr,4);
    Si le fichier est bien formaté, alors les octets iront s'empiler dans l'adresse de cr et au retour de disco, ils seront alors lus comme des float. Un peu comme si le nombre 3.14 était lu "3" puis "1" puis "4". Toutefois c'est une méthode degueu et plus que pas portable (parce que la façon de coder les float diffère d'une architecture à une autre).

    Accessoirement la petite astuce "je lis 32768 octets tant que je peux puis je lis le reste" est un peu idiote. Pour le write c'est ok mais pour le read ça ne sert à rien car read cale lui-même sa lecture. Je peux lui demander 32768 octets, s'il n'y en a plus que 3 à lire dans le fichier il m'en donnera que 3. Bref l'algorithme "resto=cont % 32768" est inutile.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    Bonjour,
    Premièrement,le compilateur m'a signalé qu'il y a des fonctions non déclarées.
    J'ai fait les modifications suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    #include  <math.h>
       #include  <stdio.h>
       #include  <stdlib.h>
     
     
    int open (const char*,int);
    int creat (const char*,int);
    int _read (int,void*,unsigned int);
    int _write (int,const void*,unsigned int);
    void close(int);
    float disco  (char fichero[], int nfil, int ncol, int control,char *a, int tipo);
    int main(void)
      {
          long int n2,kk,k,ll,ii,jj,nn,coorx,coory; 
          int dim;
          float i;
          char arch0[30], arch1[30];
          float  *ct,*cr;
          float vmax;
     
          printf("\n\ dimension du fichier:");
          scanf("%d",&dim);
          n2 = (long)dim * (long)dim ;
     
          ct = (float*)calloc(n2, sizeof(float));
          cr = (float*)calloc(n2, sizeof(float));
     
          if ( cr == NULL || ct == NULL ) { printf ( "\n Memory error."); exit(0); }
     
          printf("\n\n Introduire Cross-correlation matrice:");
          scanf("%s",arch0);
     
     
     
     
     
          i=disco(arch0,dim,dim,1,(char*)cr,4);
          if (i!=1) goto fin;
     
          printf("\n\n Introduire la matrice a translat‚:");
          scanf("%s",arch1);
          i=disco(arch1,dim,dim,1,(char*)ct,4);
          if (i!=1) goto fin;
     
          vmax=cr[0];
          for (ii=0; ii < dim; ii++)
           {
    	   ll =(long)dim * (long)ii;
    	   for (jj=0; jj < dim; jj++)
    	   {
    	   nn=ll+jj;
    	   if( cr[nn] > vmax )
    	       {
    	       vmax = cr[nn];
    	       coorx = ii;
    	       coory = jj;
    	       }
    	   }
    	}
     
    	for ( kk=0 ; kk < n2 ; kk++)
    	    {
    	     cr[kk] = 0;
    	    }
    	 coorx = coorx - dim/2;
    	 coory = coory - dim/2;
     
     
     
           for (ii=abs(coorx); ii < dim-abs(coorx); ii++)
    	   {
    	   ll =(long)dim * (long)ii;
    	   for (jj=abs(coory); jj < dim-abs(coory); jj++)
    	     {
    	    cr[(long)dim*(ii-coorx)+jj-coory]= ct[(long)dim * (long)ii+jj];
    	     }
     
    	    }
     
          printf("\n\nIntroduire le nom de la matrice centr‚:");
          scanf("%s",arch1);
          i=disco(arch1,dim,dim,2,(char*)cr,4);
          if (i!=1) goto fin;
     
    fin:
    free(cr);
    free(ct);
    return 0 ;
    }
     
     /*********************************************************************\
     *                                                                     *
     *                                                                     *
     *                            DISCO.C                                  *
     *                            =======                                  *
     *                                                                     *
     *         Rutina para trasladar n£meros de cualquier tipo desde       *
     *         una  variable  de la memoria a un disco o de un disco       *
     *         a una variable de la memoria.                               *
     *                                                                     *
     *                          ---------                                  *
     *                                                                     *
     *      Par*metros:                                                    *
     *                                                                     *
     *      fichero         -  Nombre del fichero del disco.               *
     *      nfil, ncol      -  N£mero de filas y columnas.                 *
     *      control         -  1 para leer del fichero.                    *
     *                         2 para grabar en el fichero.                *
     *      a               -  puntero que indica la variable.             *
     *      tipo            -  n§ de bytes por elemento de la variable.    *
     *                                                                     *
     *                                                                     *
     \*********************************************************************/
     
     
    float disco  (char fichero[], int nfil, int ncol, int control,char *a, int tipo)
     
    {
            long int n, cont, ng;
            int unidad, j, cociente, resto;
     
            if (control == 1)  {
                    if ((unidad = open (fichero,1))  == -1)  {
                            return (-1);
                    }
                    cont = (long) nfil * (long) ncol * tipo;
                    resto = cont % 32768;
                    cociente = cont / 32768;
                    for (j = 0, n = 0; j < cociente; j++,n += 32768)
                            _read (unidad, &a[n], 32768);
                    _read (unidad, &a[n], resto);
                    close (unidad);
                    return 1;
            }
            if (control == 2)  {
                    if ((unidad = creat (fichero, 200))  == -1)  {
                            return -1;
                    }
                    cont = (long) nfil * (long) ncol * tipo;
                    resto = cont % 32768;
                    cociente = cont / 32768;
                    ng = 0;
                    for (j = 0, n = 0; j < cociente; j++, n += 32768)
                         ng = ng + (unsigned) _write (unidad, &a[n], 32768);
                    ng = ng + (unsigned) _write (unidad, &a[n], resto);
                    if (ng != cont)   {
                            return 0;
                    }
     
                    close (unidad);
                    return 1;
            }
            return 0;
    }
    Mais,il m'a fait cet erreur: [Linker error] undefined reference to `open(char const*, int)'
    [Linker error] undefined reference to `_read(int, void*, unsigned int)'
    ainsi de suite pour les autres fonctions.

    Merci

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nomadstorm Voir le message
    Bonjour,
    Premièrement,le compilateur m'a signalé qu'il y a des fonctions non déclarées....

    Mais,il m'a fait cet erreur: [Linker error] undefined reference to `open(char const*, int)'
    [Linker error] undefined reference to `_read(int, void*, unsigned int)'
    ainsi de suite pour les autres fonctions.

    Merci
    Oui, c'est un peu un retour naturel au vu des remarques de gangsoleil. Tu utilises des fonctions non standard (comme "_read()") donc il te faut aussi la librairie où elles sont définies/compilées. Ou alors tenter de remplacer "_read()" par "read()" qui, elle, est standard mais sans garantie du résultat car si on connait bien le fonctionnement de read(), on en sait beaucoup moins sur les spécificités de "_read()"...

    Je suis toutefois ennuyé par le open() non trouvé car lui il fait partie du standard de la libc. Peut-être serait-il bon que tu nous indiques ton environnement de travail, compilateur afin qu'on voie mieux d'où peut venir le pb...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    Bonsoir,
    Merci pour la réponse,

    Le compilateurev-C++,

    Mon système d'exploitation:Windows 7

Discussions similaires

  1. [API][MFC]Graphisme - Déplacement d'un image ???
    Par Alcarbone dans le forum MFC
    Réponses: 12
    Dernier message: 26/11/2003, 21h28
  2. Déplacement ou positionnement d'une fenêtre
    Par agl dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/11/2003, 09h29
  3. Déplacement d'Objets
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 6
    Dernier message: 20/09/2003, 14h28
  4. Déplacement "automatique" du curseur
    Par Amenofis dans le forum Composants VCL
    Réponses: 2
    Dernier message: 08/01/2003, 18h57
  5. Limiter le déplacement de la souris
    Par el_bouleto dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2002, 23h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo