Diskuze: Problém s dynamicky alokovaným polem
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 18 zpráv z 18.
//= 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.
Tady máš například zápis mimo rozsah pole (pole jsou v Cčku indexována od 0, takže v tvém případě je posledním platným indexem hodnota POCETINFO-1.
char info[POCETINFO];
...
nfo[POCETINFO]=NULL;
Dále nekontroluješ, zda volání různých funkcí, které může selhat, opravdu uspělo nebo ne (fseek, fread, fwrite, malloc). A přitom na jeho úspěchu velmi záleží. Pak se těžko hledá, proč to nefunguje.
Závěrečný for cyklus děláš tolikrát, kolikrát ti diktuje proměnné xcteni, kteroužto ale neinicializuješ.
Počítám, že překldač by měl na takovýto kód vyhodit nějaká varování (není-li špatně nastaven). A řešit varování OPRAVDU MÁ smysl.
Jak říká Vrtule..
Plus, nastav si následující příznaky překladače:
-Wall -Wextra -Werror -pedantic
Bude tě pak víc hlídat
Díky za odpovědi, posílal jsem sem promazanou verzi, takže určení
počtu opakování pole tam sice je, ale sem jsem to nezkopíroval. Příznaky
prohlížeče jsem si nastavil až na ten Werror-nedovolil mi překlad když
použiju komentář.
Chybu jsem nakonec našel, že při čtení vzorků ze souboru mám adresu
proměnné, která už je sama ukazatel, takže stačilo smazat & zde:
fread(&pomocny,pocetvzorku,1,fp); //ulozeni vsech vzorku do pomocne
promenne
Mám už udělaný úspěšně i zápis vzorků do wav souboru. Problém teď mám, jak z toho udělat funkci nebo ještě lépe knihovnu, abych mohl wav soubory editovat. Problém mám aby funkce vrátila alespoň dva vektory(tj. levý a pravý kanál), které jsou navíc dynamicky alokované. Jak toho docílit?
Komentar pouzi /* */ a bude to v poriadku.
Dynamicky ich alocuj na halde a pouzi pointery na ne ako parametre funkcie. Navratova hodnota bude void, ale parametre budu vstupno-vystupne.
nebo může třeba vracet strukturu o dvou pointrech.. (pokud by trval na tom, že to
musí vracet..)
Díky, ale pořád nevím jak to provést. Zkoušel jsem je alokovat v dané funkci a pak vracet ukazatel, ale ani to nefungovalo, navíc potřebuju vrátit 3. A pokud se nebude funkcí nic vracet, tak by to musela být globální proměnná, ne? Můžete mi sem prosím hodit nějaký jednoduchý příklad?
Skús nejak takto:
#include <stdio.h>
void prepocitaj(int *a, int *b, int *c)
{
*a *= *b;
*b *= *c;
*c = *b / *a;
}
int main(void)
{
int i = 11, j = 22, k = 33;
prepocitaj(&i, &j, &k);
printf("%d, %d, %d", i, j, k);
return 0;
}
alebo
#include <stdio.h>
#include <stdlib.h>
void prepocitaj(int *pole)
{
pole[0] *= pole[1];
pole[1] *= pole[2];
pole[2] = pole[1] / pole[0];
}
int main(void)
{
int *pole;
if ((pole = (int *) malloc(3 * sizeof(int))) == NULL) {
printf("Malo pamati!");
return 1;
}
pole[0] = 11;
pole[1] = 22;
pole[2] = 33;
prepocitaj(pole);
printf("%d, %d, %d", pole[0], pole[1], pole[2]);
return 0;
}
Díky, ale já to potřebuju naopak, tj. až ve funkci alokovat pole o délce, kterou zjistím až v této funkci, něco na způsob tohoto(což mi ale taky nefunguje):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int dynam(void){
int *a;
int i;
a=(int*)malloc(sizeof(int)*10);
for(i=0;i<10;i++){
a[i]=i+1;
}
return a;
}
int main(int argc, char** argv) {
int *a;
int i;
a=dynam();
for(i=0;i<10;i++){
printf("ulozeno na %d. pozici: %d\n",i,*a);
a++;
}
//free(a);
return (EXIT_SUCCESS);
}
int dynam(void){
int a;
int i;
a=(int)malloc(sizeof(int)*10);
for(i=0;i<10;i++){
a[i]=i+1;
}
return a;
}
Návratovú hodnotu máš nastavenú na premennú typu in a nie na pointer na premennú typu int.
int * dynam(void){
(trochu OT)
zkus používat mezery.. kód je pak výrazně přehlednější a
čitelnější..
for(i = 0; i < 10; i++){
a[i] = i + 1;
}
Sorry, len som skopíroval jeho kód a zabudol som ho dať do code.
To nebylo na tebe..
Jen malá rada pro OP ohledně formátování kódu..
Díky už mi to funguje, ještě teda řeším, že potřebuji vracet dva
vektory (levý a pravý kanál wav souboru) a ještě jeden integer, kde bude
délka těch vektorů( oba jsou pochopitelně stejně dlouhé). Nedal by se na
to nějak použít ukazatel na ukazel? Zatím pořádně nechápu na co ho
vůbec použít a jak se používá, ale něco mi říká, že tady by to šlo
. Pak mám tedy ještě
další problém, který ale alespoň zdánlivě ničemu nevadí(OS si to pak
asi uvolní nějak sám) a to je, že mi potom nelze funkcí free uvolnit
alokovanou paměť, protože uvolnění musí být až v jiné funkci.
Pouzi ten sposob, co som ti pisal, teda pointery na premenne, ktore budu vstupno vystupnym parametrom. Uvolnuje sa alocovane pole, ale to tam mas.
#include <stdio.h>
#include <stdlib.h>
/* #include <string.h> */
int **vytvor_viacrozmerne_pole(const int riadky, const int stlpce)
{
int **p_p_x, i;
if ((p_p_x = (int **) malloc(riadky * sizeof(int *))) == NULL) {
printf("Nedostatok pamati.\n");
exit(1);
}
for (i = 0; i < riadky; i++)
if ((p_p_x[i] = (int *) malloc(stlpce * sizeof(int))) == NULL) {
printf("Nedostatok pamati.\n");
exit(1);
}
return(p_p_x);
}
void uvolni_viacrozmerne_pole(int **p_p_x, const int riadky)
{
int i;
for (i = 0; i < riadky; i++)
free((void *) p_p_x[i]);
free((void *) p_p_x);
}
void napln_viacrozmerne_pole(const int riadky, const int stlpce, int **p_p_x)
{
int i, j;
for (i = 0; i < riadky; i++) {
for (j = 0; j < stlpce; j++) {
p_p_x[i][j] = (i + 1) * (j + 1);
}
}
}
int *vytvor_jednorozmerne_pole(const int velkost)
{
int *p_p;
if ((p_p = (int *) malloc(velkost * sizeof(int))) == NULL) {
printf("Nedostatok pamati.\n");
exit(1);
}
return p_p;
}
void napln_jednorozmerne_pole(const int velkost, int *p_pole)
{
int i;
for (i = 0; i < velkost; i++) {
*p_pole++ = i + 1;
}
}
int main(int argc, char** argv)
{
int i;
int *p_a = vytvor_jednorozmerne_pole(10);
int **p_p_a = vytvor_viacrozmerne_pole(10, 3);
napln_jednorozmerne_pole(10, p_a);
/* vypise obsah jednorozmerneho pola */
for ( i= 0; i < 10; i++) {
printf("ulozeno na %d. pozici: %d\n", i, *p_a++);
}
free(p_a);
napln_viacrozmerne_pole(10, 3, p_p_a);
/* vypise obsah viacrozmerneho pola */
for (i = 0; i < 10; i++) {
printf("%d. riadok lava strana: %d, prava strana: %d, velkost: %d\n", i + 1, p_p_a[i][0], p_p_a[i][1], p_p_a[i][2]);
}
uvolni_viacrozmerne_pole(p_p_a, 10);
return (EXIT_SUCCESS); /* staci return 0; */
}
Zobrazeno 18 zpráv z 18.