hallo pinguine,
die frage ist ein bissche off-topic, aber da ich denke, auf der liste gibt es garantiert ein paar C-gurus will ich mal nachfragen. ich habe folgendes problem: ich möchte ein script schreiben, dass ein file einliest in dem mit tabulator getrennte datensätze stehen und diese in einer c-struktur abspeichern.
die struktur schaut folgendermaßen aus: typedef struct player { char name[30]; char surname[30]; char country[3]; }
nun möchte ich mit malloc wenn nötig speicherplatz reservieren, damit ich nicht von der anzahl der datensätze im file abhängig bin. wie ist das möglich?
bzw. ich habs eigentlich schon gelöst, es kann aber eindeutig nicht die lösung sein, da ich nur einmal folgenden code eingegeben habe: player_t *players; players = (player_t *)malloc(sizeof(player_t));
und seitdem kann ich soviele daten einlesen wie ich einlesen will.
mfg lukas
: lukas pitschl | dressy vagabonds
--- I'm still as stupid as anyone, but I know my mistakes. [Propagandhi]
"Lukas" == Lukas Pitschl lukas@dressyvagabonds.com writes:
Lukas> hallo pinguine, die frage ist ein bissche off-topic, aber Lukas> da ich denke, auf der liste gibt es garantiert ein paar Lukas> C-gurus will ich mal nachfragen. ich habe folgendes Lukas> problem: ich möchte ein script schreiben, dass ein file Lukas> einliest in dem mit tabulator getrennte datensätze stehen Lukas> und diese in einer c-struktur abspeichern.
Hi Lukas ... just could not resist (after spending 15 minutes trying to remember C).
bye, Luca
--
#!/usr/bin/env python
class Player:
def __init__(self, name, surname, country): self.name = name self.surname = surname self.country = country
def __str__(self): return "%(name)s %(surname)s (%(country)s)" % self.__dict__
def from_string (s): ss = s.split('\t') if len(ss) != 3: # I know I shouldn't raise strings... raise 'Bad string "%s"' % s return Player (*ss)
def from_list (ss): return [from_string(s) for s in ss]
if __name__ == '__main__':
import sys if len(sys.argv) > 1: # read from given file
f = open(sys.argv[1]) ss = [s[:-1] for s in f.readlines()]
else: # just for testing
# BEWARE: there should be TABS between words ss = ("foo bar zot", "spam eggs here", "me you there")
pp = from_list(ss) for p in pp: print p
Noch eine letzte Frae zu C, dann geb ich endgültig ruhe.
Was hat es mit warning: passing arg 4 of `qsort' from incompatible pointer type auf sich, wenn der folgende code fehlschlägt. die message bezieht sich auf die qsort-zeile
-----------------------------------------------------
typedef struct player { char name[NAMES]; char surname[NAMES]; char nationality[COUNTRY]; int rating; } player_t;
void sortByRating() { qsort(players, num_of_players, sizeof(player_t), ratingCompare); }
/* compare function for sort */ int ratingCompare(const player_t *player1, const player_t *player2) { if(player1->rating == player2->rating) return 0; else if(player1->rating > player2->rating) return -1; else return 1; }
vielen vielen danke für die hilfe
mfg lukas
------------------------------------------------------------------
: lukas pitschl | dressy vagabonds
--- I'm still as stupid as anyone, but I know my mistakes. [Propagandhi] Am 11.01.2005 um 11:01 schrieb Luca Manini:
"Lukas" == Lukas Pitschl lukas@dressyvagabonds.com writes:
Lukas> hallo pinguine, die frage ist ein bissche off-topic, aber Lukas> da ich denke, auf der liste gibt es garantiert ein paar Lukas> C-gurus will ich mal nachfragen. ich habe folgendes Lukas> problem: ich möchte ein script schreiben, dass ein file Lukas> einliest in dem mit tabulator getrennte datensätze stehen Lukas> und diese in einer c-struktur abspeichern. Hi Lukas ... just could not resist (after spending 15 minutes trying to remember C). bye, Luca
--
#!/usr/bin/env python
class Player:
def __init__(self, name, surname, country): self.name = name self.surname = surname self.country = country def __str__(self): return "%(name)s %(surname)s (%(country)s)" % self.__dict__
def from_string (s): ss = s.split('\t') if len(ss) != 3: # I know I shouldn't raise strings... raise 'Bad string "%s"' % s return Player (*ss)
def from_list (ss): return [from_string(s) for s in ss]
if __name__ == '__main__':
import sys if len(sys.argv) > 1: # read from given file f = open(sys.argv[1]) ss = [s[:-1] for s in f.readlines()] else: # just for testing # BEWARE: there should be TABS between words ss = ("foo bar zot", "spam eggs here", "me you there") pp = from_list(ss) for p in pp: print p
-- bye, Luca _______________________________________________ http://www.lugbz.org/mailman/listinfo/lugbz-list LUGBZ is pcn.it-powered
"Lukas" == Lukas Pitschl lukas@dressyvagabonds.com writes:
Lukas> Noch eine letzte Frae zu C, dann geb ich endgültig ruhe. Lukas> Was hat es mit warning: passing arg 4 of `qsort' from Lukas> incompatible pointer type auf sich, wenn der folgende code Lukas> fehlschlägt. die message bezieht sich auf die qsort-zeile
La signature della funzione di comparazione è:
int func (const void *a, const void *b)
quindi, per esempio...
#include <stdlib.h>
typedef struct player { int rating; } player_t;
player_t ** players; int num_of_players;
int ratingCompare(const void *a, const void *b) { player_t * p = (player_t *)(a); player_t * q = (player_t *)(b); int diff = p->rating - q->rating;
if (diff == 0) return 0; if (diff > 0) return 1; return -1; }
void sortByRating() { qsort(players, num_of_players, sizeof(player_t *), ratingCompare); }
On Tue, 2005-01-11 at 16:59 +0100, Lukas Pitschl wrote:
Noch eine letzte Frae zu C, dann geb ich endgültig ruhe.
Was hat es mit warning: passing arg 4 of `qsort' from incompatible pointer type auf sich, wenn der folgende code fehlschlägt. die message bezieht sich auf die qsort-zeile
da musst du die deklaration von qsort() mitschicken, sonst kann man nicht viel sagen. der 4. parameter muss jedenfalls als vom typ: int (const player_t *, const player_t *) definiert sein.
peter
Noch eine letzte Frae zu C, dann geb ich endgültig ruhe.
Was hat es mit warning: passing arg 4 of `qsort' from incompatible pointer type auf sich, wenn der folgende code fehlschlägt. die message bezieht sich auf die qsort-zeile
da musst du die deklaration von qsort() mitschicken, sonst kann man nicht viel sagen. der 4. parameter muss jedenfalls als vom typ: int (const player_t *, const player_t *) definiert sein.
Ich glaube Lukas verwendet qsort aus der Standardbibliothek, das wie Luca schon gesagt hat eine Funktion vom Typ int (const void *, const void *) moechte.
Die Funktionen der C Standardbibliotheken sind in den Manual Seiten erlaeutert, wenn mal keine Referenz zur Hand ist: man qsort
Viele Gruesse, Chris.