Portál AbcLinuxu, 12. května 2025 05:24

Dotaz: Pole retezcu v Cecku

26.9.2003 10:51 Tom
Pole retezcu v Cecku
Přečteno: 2140×
Odpovědět | Admin
Zdravim,

da se prosim vytvorit nejakym zpusobem pole retezcu, pokud pri kompilaci nevim kolik prvku (radku) bude obsahovat ?

klasicky se definuje pomoci

napr char *p_text[4];

p_text[0]= "prvni"; p_text[1]= "druhy"; atd.

ale jak nadefinovat toto pole pokud nebudu znat pocet "radku" pole?

Tom
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

26.9.2003 12:07 Dušan Merta | skóre: 3 | Trnávka
Rozbalit Rozbalit vše Pole retezcu v Cecku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle by ti mohl pomoct:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RADKY 5
#define DELKA 256
int main(void) {
  char **text;
  int i;
  
  /* Alokace pole. */
  text=(char **) malloc(RADKY*sizeof(char *));
  for (i=0; i<RADKY; i++)
    text[i]=(char *) malloc(DELKA*sizeof(char));
    
  /* Neco do nej dame. */
  strcpy(text[0], "prvni");
  strcpy(text[1], "druhy");
  
  /* Zkusime to vytisknout. */
  printf("%s", text[0]);
  
  /* Uvolneni pole. */
  for (i=0; i<RADKY; i++) free(text[i]);
  free(text);
  
  return(0);
}
Místo RADKY a DELKA můžeš mít libvolnou proměnnou typu int. Nezapomeň, že dvourozměrné pole musíš uvolňovat ve dvou krocích. Snad jsem to trefil, kdyžtak napiš mail.
26.9.2003 12:13 Maud Lebowski
Rozbalit Rozbalit vše Pole retezcu v Cecku
mas to asi spravne, ale on se ptal na to co delat kdyz neznas predem tu hodnotu RADKY. Zrejme bude treba to davat do tzv zasobniku, cili vytvorit strukturu s jednim ukazatelem na data a druhym na dalsi prvek:
typedef struct {
  char *radek;
  struct *radek;
} radek;
(ted si nejsem jisty syntaxi) a pak postupne pridavat prvky.. no a zpetne prochazeni taky bude horor... cili jednoducha funkce v C na to neexistuje, moznosti jsou: naprogramovat si to sam, pouzit C++ (asi nejlepsi volba) nebo pouzit nejaky script jazyk
26.9.2003 12:44 Dušan Merta | skóre: 3 | Trnávka
Rozbalit Rozbalit vše Pole retezcu v Cecku
Pokud se pocet radku meni v prubehu behu programu, tak je opravdu nejlepsi zasobnik, ale pokud pocet radku neni znam v dobe komilace, ale pri behu se jednou urci, napriklad takto:
printf("Zadej pocet radku: ");
scanf("%d", &radky);
tak pak muj priklad funguje, staci misto RADKY napsat radky:
/* Alokace pole. */
  text=(char **) malloc(radky*sizeof(char *));
  for (i=0; i<radky; i++)
    text[i]=(char *) malloc(DELKA*sizeof(char));
a je to jednodussi.
BTW:
typedef struct {
  char *retezec;
  radek *dalsi;
  radek *predchozi;
} radek;
Tohle resi docela dobre zpetne prochazeni a je to myslim dobre.
26.9.2003 13:21 Maud Lebowski
Rozbalit Rozbalit vše Pole retezcu v Cecku
jo lze to libovolne komplikovat napriklad hledanim ve vyvazenych b stromech..:-) jinak me ale jste napadla jedna vec kterou pozuivam kdyz nejde o moc dat a hodi se s nima pracovat jako s polem (typicky zpracovani dat ve fortranu), pak lze pouzit pole tak, ze se nejprve naplni 2 prvky, kdyz to nestaci tak se 2 prekkopiruji do 4 prvkoveho pole, kdyz ani to ne, tak se prekopiruje 4 prvky a vytvori 16 atd... velmi sikovne a rychle, bohuzel trochu zrout pameti..:-), ale v tomto pripade, kdy by se alokovalo jen 4byte pole ukazatelu na stringy je to urcite lepsi nez se drbat se zasobnikem
Josef Kufner avatar 26.9.2003 13:43 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Pole retezcu v Cecku
typedef struct {
  char *retezec;
  radek *dalsi;
  radek *predchozi;
} radek;

by melo byt:

typedef struct s_radek {
  char *retezec;
  struct s_radek *dalsi;
  struct s_radek *predchozi;
} radek;
Protoze radek neni tou dobou jeste deklarovan, ale struct s_radek jiz ano.
Hello world ! Segmentation fault (core dumped)
26.9.2003 14:06 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Pole retezcu v Cecku
Stejně je to vynalezání kola... (tedy, na něčem se člověk to C naučit musí, že...) Ale když chci obousměrně linkované seznamy a všechny možné funkce s nimi operující, vystačím si s #include <glib.h> (stejně tak, když chci jednosměrné seznamy, hashe, stromy, resizující se pole, etc.)
26.9.2003 12:13 sam
Rozbalit Rozbalit vše Pole retezcu v Cecku
Odpovědět | | Sbalit | Link | Blokovat | Admin
pokial viem, v c-cku neexistuju datove typy, ktore by si sami regulovali velkost podla potreby. uz aj ten tvoj priklad je podla mna troska nepresny.

ja by som to robil takto:
char **p;
p = (char **)malloc(pocet_riadkov * sizeof(char *));
p[0] = (char *)malloc(velkost_retazca * sizeof(char));
p[1] = (char *)malloc(velkost_retazca * sizeof(char));
...

26.9.2003 13:00 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Pole retezcu v Cecku
Neexistují je silné slovo, nejsou přímo součástí jazyka, nicméně vše lze doprogramovat ;-) několik takových struktur je třeba v glib. gcc umožňuje int foo(int n) { char *p[n]; ... }, ale standardní C bohužel ne. Jinak je třeba použít malloc/alloca...
28.9.2003 12:12 ApoC
Rozbalit Rozbalit vše Pole retezcu v Cecku
A nebo v C++ pouzit vektor :o)
28.9.2003 12:32 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Pole retezcu v Cecku
A bude se to kompilovat půl hodiny... ;-)
CIJOML avatar 28.9.2003 16:58 CIJOML | skóre: 58 | Praha
Rozbalit Rozbalit vše Pole retezcu v Cecku
A to vadi? Dulezita je konecna funkcnost
28.9.2003 17:14 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Pole retezcu v Cecku
Jo, vadí. Velké projekty v C++ se [s gcc] kompilují tak dlouho, že dřív umřeš, než něco vyvineš, takže na žádnou konečnou funkčnost nedojde... (a to i s ccache, protože preprocesování se tím nezbavíš, a než se načte pár STL hlaviček, můžeš si s klidem skočit na oběd).
28.9.2003 17:25 Beda
Rozbalit Rozbalit vše Pole retezcu v Cecku
... to jsem tak jednou kompiloval s g++ orbit a par veci okolo. no a dopadlo to tak, ze pro nedostatek pameti a swapu (dohromady >1G) to neuneslo par regulernich daemonu a byly odporouceny na smrt => g++ uz se uz nejmenuje g++ a g++ nedela to co se obvykle od g++ ocekava. vzivote uz si nelajznu kompilovat cokoliv v g++ na tom serveru (je desne nenazrany) a kdybych to omezil pod paricnou mez, tak by to stejne slitlo pri kompilaci, takze je to na $#%^@#

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.