Předefinování matice – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Předefinování matice – C / C++ – Fórum – Programujte.comPředefinování matice – C / C++ – Fórum – Programujte.com

 

Hover
~ Anonymní uživatel
2 příspěvky
7. 5. 2013   #1
-
0
-

Ahoj, chtěl bych se zeptat na níže uvedený zdrojový kód. Mám problém, že když udělám "předefinování" matice z rozměru 0x0 na 2x2, tak se mi vypisují špatné hodnoty. Pokud nastavím rovnou v glob. pr., že chci 2x2, tak je vše v pořádku.. Nevíte, proč se tak děje? Případně, jak by toto šlo odstranit?

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

#define DEFAULT 0
#define MAX_ELEMENT 1000

int first_matrix [0][0];

int main(void)  
{
	int f_height = 2;
	int f_width = 2;
	
	first_matrix [f_height][f_width];
Nahlásit jako SPAM
IP: 147.228.209.–
ingiraxo+15
Grafoman
7. 5. 2013   #2
-
0
-

ty vytvoříš globální proměnnou matice, která NEBUDE mít žádnou velikost, takže tam nejde dát žádná hodnota

int first_matrix[0][0]; // tohle nejde - nemá žádnou velikost
int first_matrix[2][2]; // funguje, matice bude 2x2

pokud chceš deklarovat pouze proměnnou, tak to musíš přes ukazatel, kde inicializaci provedeš třeba v main() 

int** first_matrix = NULL;

takže celá ukázka (nedoporučuju dělat globální proměnný, vše jde bez nich)

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

#define DIMENSION 4

static int** g_matice = NULL;

static void vytvorMatici()
{
    g_matice = (int **)calloc(DIMENSION, sizeof(int *));

    for (int i = 0; i < DIMENSION; ++i)
        *(g_matice + i) = (int *)calloc(DIMENSION, sizeof(int));
}

static void vypisMatici()
{
    for (int i = 0; i < DIMENSION; ++i)
    {
        for (int j = 0; j < DIMENSION; ++j)
        {
            printf("%d\t", *(*(g_matice + i) + j));
        }
        printf("\n");
    }
}

int main()
{  
    vytvorMatici();
    vypisMatici();

    return EXIT_SUCCESS;
}


Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Hover
~ Anonymní uživatel
2 příspěvky
7. 5. 2013   #3
-
0
-

#2 ingiraxo
Děkuju moc! Jen bych měl ještě dotaz..

Calloc a podobné funkce ještě moc neznám (jsem začátečník). Proto bych se chtěl zeptat, jestli je možné výše uvedený postup použít i pro klasickou deklaraci matice (matrix [vyska] [sirka])? Chtěl jsem postup s callocem zakomponovat do mého kódu, ale při zadání prvního prvku program spadne...

static int** first_matrix = NULL;

void create_first_matrix (int f_height, int f_width)
{
	first_matrix = (int **)calloc(f_height, sizeof(int *));
	
	int i;
	char help [MAX_ELEMENT];
	for (i = 0; i < f_height; i++)
	{
		int j;
		for (j = 0; j < f_width; j++)
		{
			(void) gets(help);
			first_matrix [i][j] = atoi(help);
			help[0] = '\0';
			
		}
	}
	
	printf("=%i=\n", first_matrix[0][0]);
	printf("=%i=\n", first_matrix[0][1]);
	printf("=%i=\n", first_matrix[1][0]);
	printf("=%i=\n", first_matrix[1][1]);
}
Nahlásit jako SPAM
IP: 147.228.209.–
ingiraxo+15
Grafoman
8. 5. 2013   #4
-
0
-

#3 Hover
jistě, protože se jedná o matici, musíš alokovat jak počet sloupců, tak počet řádků.. funkce calloc slouží právě pro alokaci a v tvém kódu alokuješ jen počet řádků

a z konzole můžeš číst rovnou čísla přes scanf

 takže ta funkce bude vypadat... (a vypis hodnot matice si dej třeba do main())

void create_first_matrix(const int row, const int column)
{
    int x, y, number;

    first_matrix = (int **)calloc(row, sizeof(int *));

    for (x = 0; x < row; ++x)
    {
        *(first_matrix + x) = (int *)calloc(column, sizeof(int));

        for (y = 0; y < column; ++y)
        {
            printf("Zadej hodnotu na pozici %dx%d: ", x, y);
            scanf("%d", &number);
            *(*(first_matrix + x) + y) = number;
        }
    }
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

Podobná vlákna

Matice — založil nettinka

Matice — založil Frantisek

Matice — založil alda66

Matice — založil Frantisek

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý