Wypełnianie tablicy dynamicznej a statycznej.

0

Cześć!

Mam program do wypełniania tablicy dynamicznej o zadanym rozmiarze liczbami będącymi iloczynem ich indeksów a potem zamiany ich znaków.

 
#include<stdio.h>
#include<stdlib.h>

int main(){
int n,m,i,j;
int *tab;
printf("Podaj liczbe wierszy:");
scanf("%d",&n);
printf("Podaj liczbe kolumn:");
scanf("%d",&m);
printf ("\nZawartosc oryginalna:\n");
tab = (int*)malloc((n*m) * sizeof *tab);
for(i=0;i<=(n-1);i++)
	for(j=0;j<=(m-1);j++)
		*(tab+(i*m)+j)=(i*j);
for(i=0;i<=(n-1);i++){
	for(j=0;j<=(m-1);j++)
		printf("%3d  ",*(tab+(i*m)+j));
		printf("\n");
	}
printf ("Zawartosc po zmianie znakow:\n");
	{
for(i=0;i<=(n-1);i++)
	for(j=0;j<=(m-1);j++)
		*(tab+(i*m)+j)=-(i*j);
for(i=0;i<=(n-1);i++)
	{
	for(j=0;j<=(m-1);j++)
		printf("%3d  ",*(tab+(i*m)+j));
		printf("\n");
		}
		return 1;
	}
}

I działa dobrze.
Nie umiem jednak zrobić rzeczy z pozoru prostszej, czyli tego samego dla tablicy statycznej. Chcę, żeby tablica zawsze była np. 5x5, więc robię tak:

 
/* Wypełnienie elementów tablicy dwuwymiarowej (o wymiarze podanym jako parametr funkcji) liczbami będącymi iloczynem ich indeksów. */
#include<stdio.h>
#include<stdlib.h>

int main(){
int n=5,m=5,i,j;
int tab[n][m];
printf ("\nZawartosc oryginalna:\n");
for(i=0;i<=(n-1);i++)
	for(j=0;j<=(m-1);j++)
		*(tab+(i*m)+j)=(i*j);
for(i=0;i<=(n-1);i++){
	for(j=0;j<=(m-1);j++)
		printf("%3d  ",*(tab+(i*m)+j));
		printf("\n");
	}
printf ("Zawartosc po zmianie znakow:\n");
	{
for(i=0;i<=(n-1);i++)
	for(j=0;j<=(m-1);j++)
		*(tab+(i*m)+j)=-(i*j);
for(i=0;i<=(n-1);i++)
	{
	for(j=0;j<=(m-1);j++)
		printf("%3d  ",*(tab+(i*m)+j));
		printf("\n");
		}
		return 1;
	}
}

Odpowiedź kompilatora:

11:17 error: incompatible types when issigning to type 'int [(unsigned int)(m)]' from type 'int'
identycznie w
21:17

Co jest źle?
Pozdrawiam.

0

Deklaracja tablicy powinna zawierać stałe czasu kompilacji, n i m nimi nie są. Dodaj const do ich deklaracji.

0

istnieje taki magiczny operator [] poczytaj o nim.

0

Mam nadzieję że nie palnę czegoś źle, bo nie chce mi się sprawdzać.
Problem jest w tym, że wyrażenie tab + whatever w twoim wypadku nie jest wskaźnikiem do int, ale wskaźnikiem na 5 elementową tablicę int'ów(int (*x)[5];). Powinno działać tak: *(*(tab + i*m) + j) = i*j *(*(tab + i) + j) = i*j (thx @_13th_Dragon)

@al_guest: w C istnieje coś takiego jak VLA

0

byku_guzio: niestety nie działa.
11:21 oraz 21:21 warning: assignment makes pointer from integer without a cast (enabled by default)

na wyjściu pojawiają się ciągi znaków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1