2017-08-18 4 views
1

Je suis nouveau en C, et des pointeurs dans ce sens, donc de l'aide serait formidable. Mon programme a planté plusieurs fois lorsque j'essaie d'exécuter ce code.
Ma méthode punkt_paa_linje renvoie un entier, au lieu d'une chaîne, à cause des pointeurs que je suppose. J'ai une compréhension très vague de pointeurs, donc une explication serait très appréciéLe programme ne cesse de planter

char punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3]) 
{ 
int i; 
double t1; 
double t2; 
double t3; 
for(i = 0; i < 3; i = i + 1){ 
    double t = (punkt[i]-linje_1[i])/linje_2[i]; 

    if(i == 0){ 
     t1 = t; 
    } else if (i == 1){ 
     t2 = t; 
    } else if (i == 2){ 
     t3 = t; 
    } 
} 

if(t1 == t2 && t2 == t3){ 
    return "true"; 
} else { 
    return "false"; 
} 
} 

Et quand je l'appelle la fonction, il retourne 36

int main() 
{ 
int et[] = {1,2,3}; 
int to[] = {4,5,6}; 
int tre[] = {7,8,9}; 
printf("%d\n", punkt_paa_linje(et, to, tre)); 
return 0; 
} 

EDIT: La raison pour laquelle je ne l'ai pas insérer une message d'erreur est parce qu'il n'y en a aucun

+0

Quelles sont les erreurs? Cela serait utile. – Carcigenicate

+3

'return" true ";' ce n'est pas un 'char' ou un' int'. compiler avec des avertissements sur nous parlerons plus tard. –

+2

https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ et https://stackoverflow.com/questions/2069367/how-to-debug-using-gdb – Yunnosch

Répondre

3

Je vais essayer d'expliquer vos erreurs. Vous essayez de retourner string littéral. Ce qui a le type const char* et son seqention de caractères dans durée de stockage statique mémoire, comme ce

n n+1 n+2 n+3 n+4  <-- Addresses 
+---+---+---+---+----+ 
|'t'|'r'|'u'|'e'|'\0'| 
+---+---+---+---+----+ 

Et vous essayez de retourner cette chaîne via char, qui est un octet en mémoire, comme celui-ci

n 
+---+ 
|'t'| 
+---+ 

vous devez retourner string au lieu de char, où la chaîne est passée par pointeur au premier caractère C.

const char * punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3]) 
... 
return "true"; 

%d spécificateur attend paramètre de type int, alors que votre fonction retourne maintenant string, qui a spécificateur %s.

printf("%s\n", punkt_paa_linje(et, to, tre)); 

Les tableaux dans C sont passés comme pointeur, donc au lieu de paramètres int linje_1[3] utilisation peuvent simplement utiliser int * linje_1 ou int linje_1[] - la même, et il acceptera des tableaux de toutes les longueurs.


Here is live demo. Cliquez simplement sur Lancer :-)

3

Vous devez utiliser char *punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3]) au lieu de char punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3]).

Et d'utiliser printf("%s\n", punkt_paa_linje(et, to, tre));. Alors votre code fonctionnera parfaitement et donnera la sortie true.

essayer autrement:

#include <stdio.h> 
int punkt_paa_linje(int linje_1[3], int linje_2[3], int punkt[3]) 
{ 
    int i; 
    double t1; 
    double t2; 
    double t3; 
    for(i = 0; i < 3; i = i + 1){ 
      double t = (punkt[i]-linje_1[i])/linje_2[i]; 

      if(i == 0){ 
        t1 = t; 
      } else if (i == 1){ 
        t2 = t; 
      } else if (i == 2){ 
        t3 = t; 
      } 
    } 

    if(t1 == t2 && t2 == t3){ 
      return 1; 
    } 
    else { 
      return 0; 
    } 
} 
int main() 
{ 
    int et[] = {1,2,3}; 
    int to[] = {4,5,6}; 
    int tre[] = {7,8,9}; 
    printf("%d\n", punkt_paa_linje(et, to, tre)); 
    return 0; 
} 

Sortie:

1 
+0

_ "Ma méthode punkt_paa_linje retourne un entier , au lieu d'une chaîne "_ Il n'a pas dit qu'il veut que cette fonction retourne" int ":-) –

1

Vous devriez appeler votre fonction char *punkt_paa_linje, provoque ici, il suffit de retourner char et vous avez besoin d'une str, qui est un type char *.

Donc, si vous voulez vraiment que votre fonction pour retourner un appel char il char punkt_paa_linje

0

Il y a plusieurs choses lors du retour de la fonction string en c: - chaîne de retour 1.Ne jamais variable locale de la fonction puisque toute variable locale d'une fonction sera stocké dans la pile et la pile sera détruite une fois que la fonction sera retournée, donc la variable locale sera invalide maintenant. 2.Si vous voulez rétrograder la fonction de chaîne, vous devez utiliser: - 1.Heap memory. 2. Variable statique. 3. Chaîne constante littérale.

Dans votre exemple, si vous voulez renvoyer une chaîne, vous devez utiliser char * comme type de retour d'une fonction. char * punkt_paa_linje()

Au lieu d'utiliser% d dans printf dans votre code, utilisez% s pour l'impression de la chaîne. printf ("% s \ n", punkt_paa_linje (et, to, tre));