Sice jsem v programování nováček, ale zkusil bych v příkazu pro kompilaci vynechat -std=99
Příspěvky odeslané z IP adresy 89.176.51.–
No názvy "matice" ve všech funkcích nejsou úplně dobře zvolené z hlediska didaktiky, protože každý z nich má rozsah platnosti pouze v tom bloku (funkci), kde je deklarován. Tudíž poslední funkci můžu stejně dobře napsat jako
void vypis_matici(char ** pole, int nc, int i) {
int i2 = 0;
int i3 = 0;
pole[0][0] = 'a';
for(i2 = 0; i2 < i; i2++) {
for(i3 = 0; i3 < nc; i3++) {
printf("%c", pole[i2][i3]);
}
printf("\n");
}
}
a opět to bude fungovat. Funkci se nepredava jmeno, nebo neco podobneho, ale ukazatel na tu matici.
Edit: ano, bude měnit to pole "matice"
Teď bych prozměnu chtěl o něco poprosit já tebe, učím se sám programovat v C/C++ ale chybí mi nějaké příklady, mohl by jsi mi tedy prosím do pošty hodit zadání té práce? Popřípadě i jiná pokud jich máš víc. Díky.
To Why : Jsem rád, že to pomohlo
int read_row(int *needed_cols, char ** b_row)
Hvězdičky znamenají, že druhý argument té funkce je ukazatel na ukazatel na char. Dalo by se to zapsat i takto:
int read_row(int *needed_cols, char *b_row[])
ale já raději používám tu první formu zápisu.
Ad getchar() a int:
funkce getchar vrací proměnou typu int. Přetypování na char se provede implicitně až na tomto řádku, závorky jsou nezbytné kvůli prioritě operátorů:
(*b_row)[i] = ch;
ASCII znaky se vejdou do nejnižších 7 bitů, takže při přetypování na char nedojde ke ztrátě informace
A ten poslední problém bych vyřešil následovně:
v main:
vypis_matici(matice,needed_cols,i);
a fce:
void vypis_matici(char ** matice, int nc, int i) {
int i2 = 0;
int i3 = 0;
matice[0][0] = 'a';
for(i2 = 0; i2 < i; i2++) {
for(i3 = 0; i3 < nc; i3++) {
printf("%c", matice[i2][i3]);
}
printf("\n");
}
}
To Why : Tak už to mám hotové. Je tam mnoho oprav, projdi si to řádek po řádku. Abych upozornil na nejzáludnější chyby:
řádek 13 - způsobí, že nebude možno načíst řádek delší než 3 znaky (podmínka ve funkci read_row() už v prvním volá ní po načtení čtvtého znaku způsobí ukončení funkce.
řádek 15 - má být *b_row ...
řádek 28 - má být (*b_row)[i] ...
řádek 60 - všude má být && namísto ||
k čemu je dobrý řádek 64? last_needed_cols se může zrušit a dále v souboru místo toho použít needed_cols
přikládám soubor, možná je v něm trochu rozházené odsazování, já to původně kopíroval tady ze stránek a trochu mi to blblo
Celé si to důkladně projdi
Edit: v tom přiloženém souboru na začátku main() inicializuj promennou vystup
vystup = 0;
nebovystup = OK;
Po prvním zběžném prolítnutí vidím 2 problémy.
Na řádku 55
char matice;
by mělo spíš být
char ** matice;
poté tedy na radku 57 musí být toto:
alokuj_pole(velikost, matice);
a na řádku 46 má být toto
pole = (char**) malloc ( sizeof ( *pole ) * n );
To jsou věci, které jsem viděl na první pohled, snad to k nakopnutí bude stačit, pokud ne, tak napište.