Diskuze: Triangle validity test in C
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 4 zpráv z 4.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Segmenation fault ti nastáva pretože sa snažíš zapisovať do pola pre ktoré nemáš alokovanú pamäť, preto ju treba alokovať dynamicky.
Pridaj knižnicu
#include <stdlib.h>
Namiesto
float trojuhelnik[pocet_trojuhelniku][3];
daj
float **trojuhelnik;
Následne pred for-om v ktorom ideš načítavať jednotlivé strany trojuholníka (ak "check" je 1) si alokuj potrebnú pamäť
trojuhelnik = (float**)malloc(pocet_trojuhelniku * sizeof(float*));
for (i = 0; i < pocet_trojuhelniku; i++) {
trojuhelnik[i] = (float*)malloc(POCET_STRAN_TROJUHOLNIKA * sizeof(float));
}
Po tomto už môžeš klasicky pracovať s "trojuhelnik" ako s dvojrozmerným polom.
Nakoniec keď už nebudeš "trojuhelnik" používať alebo pred ukončením programu uvolni alokovanú pamäť presne opačným spôsobom ako pri alokovaní
for (i = 0; i < pocet_trojuhelniku; i++) {
free(trojuhelnik[i]);
}
free(trojuhelnik);
int pocet_trojuhelniku;
char letter_check;
do {
printf("Please enter the number of triangles to check: ");
scanf("%d", &pocet_trojuhelniku);
letter_check = getchar();
if (letter_check != '\n'){
printf("Invalid number of triangles.\n");
while (getchar() != '\n');
continue;
}
if ((pocet_trojuhelniku < 1) || (pocet_trojuhelniku > UCHAR_MAX)) {
printf("Invalid number of triangles.\n");
}
} while ((pocet_trojuhelniku < 1) || (pocet_trojuhelniku > UCHAR_MAX) || (letter_check != '\n'));
Ještě pár tipů:
// Ladeni
#define DEBUG 1
// Strukturova sablona
struct sTriangle {
float a;
float b;
float c;
};
// Promenne
int i;
int pocet_trojuhelniku;
struct sTriangle *triangle = NULL;
// Alokace pameti pro pole struktur
triangle = (struct sTriangle *)malloc(pocet_trojuhelniku * sizeof(struct sTriangle));
if (!triangle) {
printf("Chyba alokace pameti.\n");
exit(1);
}
// kontrolni vypis mnozstvi alokovane pameti
#if(DEBUG)
printf("Mnozstvi alokovane pameti: %d bytu\n\n", pocet_trojuhelniku * sizeof(struct sTriangle));
#endif
// Nacteni stran trojuhleniku
for (i = 0; i < pocet_trojuhelniku; i++) {
printf("Zadej 1. stranu %d. trojuhelnika: ", i + 1);
scanf("%f", &((triangle + i)->a));
printf("Zadej 2. stranu %d. trojuhelnika: ", i + 1);
scanf("%f", &((triangle + i)->b));
printf("Zadej 3. stranu %d. trojuhelnika: ", i + 1);
scanf("%f", &((triangle + i)->c));
printf("\n");
}
// kontrolni vypis trojuhelniku
#if(DEBUG)
for (i = 0; i < pocet_trojuhelniku; i++) {
printf("%d. trojuhelnik: %f %f %f\n", i + 1, (triangle+i)->a, (triangle + i)->b, (triangle + i)->c);
}
printf("\n");
#endif
// uvolneni pameti
free(triangle);
triangle = NULL;
Kód neobsahuje ošetření vstupů
Zobrazeno 4 zpráv z 4.