0
votes

Le programme C ne compilera pas: il affiche une erreur "lvalue"

#include <stdio.h>
int main()
{
    int ary[2][3];
    foo(ary);
}
void foo(int (*ary)[3])
{
    int i = 10, j = 2, k;
    ary[0] = &i;
    ary[1] = &j;
    for (k = 0;k < 2; k++)
    printf("%d\n", *ary[k]);
}
I tried it with many different compilers but I do not understand why this will not compile.
c

0 commentaires

3 Réponses :


-3
votes

Dans un tableau en langage C, la structure et l'union passent toujours par référence. Le langage C ne vérifie pas strictement le type de référence et prend également en charge le cast implicite.

void foo (int (* ary) [3]) c'est une syntaxe de passage d'une fonction à une fonction comme référence (fonction de rappel). mais vous essayez d'attribuer une valeur à une fonction qui est implicitement convertie par c n'a pas d'importance, vous passez une référence de tableau. c'est pourquoi il affiche une erreur de valeur.

LValue implique que si vous attribuez une valeur à l'aide de l'opérateur d'affectation (=), le côté gauche doit être une variable, mais dans votre cas, il s'agit d'une référence de rappel.

J'espère que son aide.


3 commentaires

Dans la matrice de langage C, Structure et Union passe toujours avec référence - Non, ils sont toujours passés par la valeur. Non Vérifiez strictement Type de référence - Il n'existe pas de "type de référence" en langage C, un pointeur sur une variable transmis à une fonction est couramment reconditionné comme référence. Il s'agit d'une syntaxe de transmettre une fonction à une fonction comme référence - non, pas du tout, c'est une déclaration de fonction normale qui prend un pointeur sur un tableau de 3 int s comme un argument. Ce n'est pas une "fonction de rappel" (ou peut-être que c'est - veuillez définir ce terme).


exécutez ce programme et vous comprenez que le tableau est vraiment passé par valeur ou référence int main () {int arr [] = {1,2,3}; printf ("% d \ n", arr); printf ("% d \ n", & arr); checkCallByValueOrRefernce (arr); return 0; } checkCallByValueOrRefernce (int * arr) {printf ("% d \ n", arr); printf ("% d \ n", & arr); }


veuillez vous référer à qsort (...) qui est le meilleur exemple de fonction de rappel en langage C.



0
votes
#include <stdio.h>

void foo(int (*ary)[3]);


int main()
{
    int ary[2][3];
    int (*x)[3] = &ary[0];
    foo(&ary[0]);
}
void foo(int (*ary)[3])
{
    int i = 10, j = 2, k;
    *ary[0] = i;
    *ary[1] = j;
    for (k = 0;k < 2; k++)
    printf("%d\n", *ary[k]);
}

2 commentaires

je ne veux pas corriger mon code. Je suis intéressé de savoir pourquoi ce code se comporte comme ça.


Peut-être que vous ne voulez pas mais vous en avez besoin. Voyez la différence et réfléchissez