2010-09-03 7 views
0

J'ai un problème avec la troisième fonction (GetMatrix) les autres fonctionnent. je veux attraper les données de l'utilisateur dans la matrice par Poiters seulementmatrice utilisant des pointeurs

les lignes:

typedef int pArr[COLS]; 

void GetMatrix(pArr* ,int , int); 

M[ROWS][COLS]; 

sont contraintes

comment je dois faire l'analyse, j'essaie d'utiliser scanf("%d",*(M+cols*i+j)) mais i obtenir error..its probablement tort ce qui est nécessaire de faire pour la rendre droite

thx tous

le code:

#pragma warning (disable: 4996) 
#include <stdio.h> 
#include <string.h> 
#define ROWS 2 
#define COLS 3 

typedef int pArr[COLS]; 

void MergeStrings(char* str1,char* str2,char* strRes); 
void StrReverse(char* strRes,char* strRev); 
void GetMatrix(pArr* M ,int rows , int cols); 

void main() 
{ 
char str1[256],str2[256],strRes[256],strRev[256]; 
int M[ROWS][COLS]; 

printf("Please enter first string:\n"); 
flushall(); 
gets(str1); 
printf("\nPlease enter second string:\n"); 
flushall(); 
gets(str2); 

printf("\nMerge of: %s\n",str1); 
printf("with: %s\n",str2); 

MergeStrings(str1,str2,strRes); 

StrReverse(strRes,strRev); 

printf("is:\n"); 
printf("==> %s\n",strRes); 

printf("\nthe reversed merged string is:\n"); 
printf("==> %s\n\n",strRev); 

GetMatrix(M,ROWS,COLS); 
} 

void MergeStrings(char* str1,char* str2,char* strRes) 
{ 
int i=0,j=0,a=0,flag=0,flag2=0; 

do 
{ 

    while(*(str1+i)==' ') 
    i++; 

    while(*(str2+j)==' ') 
    j++; 

    while(*(str1+i)!=' ' && *(str1+i)!='\0') 
    { 
    *(strRes+a)=*(str1+i); 
    i++; 
    a++; 
    } 

    if(flag!=1) 
    { 
    *(strRes+a)=' '; 
    a++; 
    } 

    if(*(str1+i)=='\0') 
    flag=1; 

    while(*(str2+j)!=' ' && *(str2+j)!='\0') 
    { 
    *(strRes+a)=*(str2+j); 
    j++; 
    a++; 
    } 

    if(flag2!=1) 
    { 
    *(strRes+a)=' '; 
    a++; 
    } 

    if(*(str2+j)=='\0') 
    flag2=1; 

}while((*(str1+i)!='\0') || (*(str2+j)!='\0')); 

*(strRes+a)='\0'; 

} 

void StrReverse(char* strRes,char* strRev) 
{ 
int size,i=0,j=0; 
size=strlen(strRes); 

for(i=size-2 ; i>=0 ;i--) 
{ 
    *(strRev+j)=*(strRes+i); 
    j++; 
} 

*(strRev+size-1)='\0'; 

} 
void GetMatrix(pArr* M ,int rows , int cols) 
{ 


} 
+0

Quelle est l'erreur que vous obtenez? – Gian

Répondre

0
#define ROWS 2 
#define COLS 3 
typedef int pArr[COLS]; 
void GetMatrix(pArr* M ,int rows , int cols) 
{ 
    for(int i = 0; i < rows; i++) 
    for(int j = 0; j < cols; j++) 
     scanf("%d", &(M[i][j])); 
} 

int main() 
{ 
    int M[ROWS][COLS] = {{100, 101, 102},{103, 104, 105}}; 
    printf("before\n"); 
    for(int i = 0; i < ROWS; i++){ 
     for(int j = 0; j < COLS; j++) 
      printf("%d ", M[i][j]); 
     printf("\n"); 
    } 
    printf("enter values\n"); 
    GetMatrix(M, ROWS, COLS); 
    printf("after\n"); 
    for(int i = 0; i < ROWS; i++){ 
     for(int j = 0; j < COLS; j++) 
      printf("%d ", M[i][j]); 
     printf("\n"); 
    } 
} 

sortie:

before 
100 101 102 
103 104 105 
enter values 
0 1 2 3 4 5 
after 
0 1 2 
3 4 5 

l'intérieur de la fonction, M est un pointeur sur un tableau de trois nombres entiers. M[i] est le i-ème tableau et M[i][j] est le j-ème élément du i-ème tableau. L'opérateur & donne son adresse au scanf, qui stocke heureusement le numéro lu dedans.

Voici ce qui se passe lorsque vous remplacez scanf("%d", &(M[i][j])); avec scanf("%d",*(M+cols*i+j)):

for(int i = 0; i < rows; i++) 
    for(int j = 0; j < cols; j++) 
     scanf("%d", *(M + cols * i + j)); 

snip ..

before 
100 101 102 
103 104 105 
enter values 
0 1 2 3 4 5 
after 
0 101 102 
1 104 105 
  • Dans la première itération de la boucle interne, i et j sont nuls, et *(M+cols*i+j) devient *M. Puisque M est un pointeur vers un tableau, le déréférencement vous donne un tableau d'entiers qui se désintègrent en pointeur vers un entier. Ainsi, le premier numéro est stocké au bon endroit. Dans la deuxième itération de la boucle interne, j vaut 1. Ainsi, il s'agit de *(M + 1). L'arithmétique du pointeur entre en image ici. Puisque M est un pointeur sur un tableau de trois entiers, (M + 1) est un pointeur vers un tableau de trois entiers qui pointe vers le second tableau; déréférencer donne le tableau, qui se désintègre en pointeur et scanf écrit le deuxième nombre là.
  • Dans la troisième itération, j est 2 et pointe vers le troisième tableau (inexistant) et scanf écrit le numéro entré dans cet emplacement de mémoire dans la pile, corrompant ainsi la pile.
  • Donc sur et ainsi de suite. Il tente d'écrire dans chaque troisième emplacement entier, laissant intactes nos valeurs pré-initialisées (101, 102, 104, 105).

Si vous voulez avec des pointeurs, vous pouvez lancer M comme un pointeur vers int comme dans:

scanf("%d", (int*)M + cols * i + j); 

Une fois que vous lancez M comme int*, ajoute l'arithmétique des pointeurs 1 * sizeof(int) au départ position au lieu de 1 * sizeof(array of three ints), donnant ainsi les résultats souhaités.


Mise à jour - répondre au commentaire reçu sur Facebook.

Tenir compte de l'extrait:

int a = 10; 
scanf("%d", &a); 
printf("%d", a); 

Scanf stocke la valeur saisie à l'adresse indiquée - d'où l'on passe un pointeur vers int comme argument. printf affiche la valeur transmise - donc nous passons un int comme argument. La même différence s'applique ici. ((int*)M + cols * i + j) est de type int*, pointeur vers un entier. Pour imprimer l'entier à cet emplacement, nous devons le déréférencer en utilisant l'opérateur *. Ainsi, il devient:

printf("%d\t",*((int*)M + cols * i + j)); 

Oh, et par la manière, vous auriez reçu une réponse plus rapide si vous aviez posté vos doutes ici même au lieu de mon FB. Il y a beaucoup de bonnes personnes prêtes à aider à traîner dans SO - et je vérifie FB seulement le week-end.

+0

mais j'ai la contrainte de ne pas utiliser [] son ​​doit être juste avec des pointeurs – eliran

+0

@eliran voir la mise à jour – Amarghosh

+0

merci !!!!! beaucoup!! – eliran

0

voulez-vous dire?

int GetMatrix(pArr* M ,int rows , int cols) 
{ 
    return 1==scanf("%d",&M[rows][cols]); 
} 
+0

pas je ne peux pas le changer int – eliran

+0

pas je ne peux pas changer la fonction int son besoin d'être vide – eliran

+0

j'ai contrainte de ne pas utiliser [] son ​​devoir être juste avec des pointeurs – eliran

Questions connexes