HDTenEightyP/NetNews huggingface dataset:
From: urlichs@smurf.sub.org (Matthias Urlichs)
Newsgroups: de.comp.lang.c
Subject: Re: qsort nach mehreren kriterien
Date: 22 Aug 1992 23:51:43 +0200
Organization: University of Karlsruhe, FRG
NNTP-Posting-Host: 127.0.0.1

In de.comp.lang.c, article <ae5sPB1w165w@ariane.nbg.sub.org>,
  manfred@ariane.nbg.sub.org writes:
> 
> Ich habe hier wieder mal ein kleines (fuer mich groesseres) Problem:
> 
> Ich muss meine Struktur in dieser Reihenfolge Sortieren:
> 
> nach Klassen
> innerhalb der Klassen nach Geschlecht
> innerhalb des Geschlechts nach Runden
> innerhalb der Runden wiederum nach der Zeit
> 
> Um nur nach der Zeit zu sortieren habe ich folgende vergleichsfunktion:
> 
> qsort(person,l,sizeof(STARTER),(fcmp)ziel_cmp);
> 
> int ziel_cmp(STARTER *bp1, STARTER *bp2)
> {
>     return strcmp(bp1->zeit, bp2->zeit);
> }
> 
Erster Ansatz:

int all_cmp(STARTER *bp1, STARTER *bp2) 
{
	int r;

	if(r = strcmp(bp1->klasse, bp2->klasse)) return r;
	if(r = strcmp(bp1->geschlecht, bp2->geschlecht)) return r;
	if(r = strcmp(bp1->runden, bp2->runden)) return r;
	if(r = strcmp(bp1->zeit, bp2->zeit)) return r;
	return 0;
}

Annahme: Das sind alles wohlgeformte Strings, insbesondere mit Zahlenangaben,
die alle de gleiche Stellenzahl haben.
Wenn das nicht so ist, dann zieh den Krempel stattdessen voneinander ab:

	if(r = bp1->klasse - bp2->klasse) return r;
	[ etc.pp. ]

> Wer kann mir helfen, bis mitte September muss das funktionieren, denn
> im Oktober ist das Moutainbikerennen wo die Software das erste mal
> eingesetzt werden soll.
> 
Wenn ich ganz ehrlich sein soll -- das haettest du durch minimale Denkarbeit
selber schaffen koennen.


-- 
ONTOGENY RECAPITULATES PHILOGENY -- OR, IS THAT
ONTOLOGY RECAPITULATES PHILOLOGY...???
-- 
Matthias Urlichs  --  urlichs@smurf.sub.org -- urlichs@smurf.ira.uka.de   /(o\
Humboldtstrasse 7 -- 7500 Karlsruhe 1 -- Germany  --  +49-721-9612521     \o)/
From: manfred@ariane.nbg.sub.org (Manfred Onderka)
Newsgroups: de.comp.lang.c
Subject: qsort nach mehreren kriterien
Date: Thu, 20 Aug 92 15:23:45 MESZ
Reply-To: manfred@ariane.nbg.sub.org
Organization: Manfred's private Waffle-UUCP-Site, Germany

Hallo...

Ich habe hier wieder mal ein kleines (fuer mich groesseres) Problem:

Background:
Ich programmiere ein Programm welches aus einer Externen Zeitmessungs-
einrichtung Zeiten ueber die Parallele Schnittstelle einliest, den jeweiligen
Startnummern, die ich eingebe, zuordnet, und spaeter in Listen, die
Sortiert sein muessen, auf dem Drucker ausgibt.

Mein Problem ist, das ich mit dem qsort meine Struktur immer nur nach einem
Kriterium sortieren kann, und ich muss meinen gesamten daten nach
4-5 kriterien sortieren:

Welche moeglichkeiten bieten sich da, um moeglichst wenig Programmieraufwand
zu treiben, denn mit lauter if-abfragen und for-Schleifen muesste ich das
auch hinbekommmen, aber es ist halt eine Menge arbeit !!!

Ich muss meine Struktur in dieser Reihenfolge Sortieren:

nach Klassen
innerhalb der Klassen nach Geschlecht
innerhalb des Geschlechts nach Runden
innerhalb der Runden wiederum nach der Zeit

Um nur nach der Zeit zu sortieren habe ich folgende vergleichsfunktion:



qsort(person,l,sizeof(STARTER),(fcmp)ziel_cmp);


int ziel_cmp(STARTER *bp1, STARTER *bp2)
{
    return strcmp(bp1->zeit, bp2->zeit);
}


Wer kann mir helfen, bis mitte September muss das funktionieren, denn
im Oktober ist das Moutainbikerennen wo die Software das erste mal
eingesetzt werden soll.

Thanks all....


--
    Manfred Onderka, Ottogasse 9, W-8560 Lauf, Tel. +49 9123 988336
                E-Mail: manfred@ariane.nbg.sub.org
From: stets@stets.novalis.public.sub.org (Thomas Stets)
Newsgroups: de.comp.lang.c
Subject: Re: Verhalten von struct-Pointers
Distribution: world
Date: Thu, 13 Aug 92 18:57:03 GMT
Organization: Just me.

maennig@anton.informatik.uni-dortmund.de writes in article <16blbiINNjd7@fbi-news.Informatik.Uni-Dortmund.DE>:
>
> Hallo,
> ich weiss, dass das jetzt wieder 'ne dumme Frage ist, aber ich verstehe
> nicht, wie der Compiler struct-Pointer behandelt (oder Pointer allgemein?)
> Und zwar nehme man folgendes Progr"ammchen:

[source deleted]

> structure-Werte k"onnen durch Angabe eines Pointers auf structure ge"andert
> werden, warum aber wird structure auf NULL gesetzt, wenn freestruct() so
> aussieht:
>
> void freestruct(TEST *s)
> {
>     free(s);
>     s = 0x0;
> }
>
> und der Aufruf freestruct(structure) lautet?
> Wird der Speicherplatz f"ur structure im zweiten Fall "uberhaupt freigegeben?

Willst Du sagen, dass Dein Compiler in dem zweiten Beispiel structure
(= die Variable in main) auf NULL setzt?
Ich bin mir ziemlich sicher, dass das nicht passieren darf. (Und ein
schneller Test mit MSC 6.0 bestaetigt das.)
Die Variable s in freestruct ist eine lokale Variable, und Aenderungen
dieser Variable duerfen sich nicht auf die aufrufende Funktion auswirken.
Der Speicherplatz fuer structure wird natuerlich freigegeben.

>
> Fragend,
>       Olaf

  Antwortend,
        Thomas


--
-----------------------------------------------------------------------------
Thomas Stets  Tel. +49 (7031) 04957       ! Sweet freedom whispered in my ear
Holzgerlingen, Germany                    ! You're a butterfly
                                          ! And butterflies are free to fly
stets@stets.novalis.public.sub.org        ! Fly away, high away, bye bye.
-----------------------------------------------------------------------------
Date: Thu, 13 Aug 1992 16:52:00 CET
From: m.mueller@a-link-h.comlink.de
Reply-To: m.mueller@a-link-h.comlink.de
Distribution: world
Newsgroups: de.comp.lang.c
Subject: Re: 'static' innerhalb einer Schleife??
Organization: Aquila Jugendmailboxprojekt, Langenhagen
Content-Length: 660     
X-Gateway: UU uzercp [UZERCP V3.97]

Schon klar!
In meiner Hektik habe ich natuerlich nicht aufgepasst!

Die statik-Anweisung hat natuerlich nichts mit der Schleife zu tun.
Vielmehr kann eine solche Definition innerhalb jedes Blocks auftauchen,
wobei ein Block durch die geschweiften Klammern markiert wird.

> main()
> {
> 	int a = 1;
> 	while (a < 4)
> 	{
> 		int b=1;
> 		static int c=1;
>
> 			a++;
> 			b++;
> 			c++;
> 	}
> 	a = c;        /*   In dieser Zeile...*/
> }
>
> >> Die Fehlermeldung lautet:
> >> Undefined symbol 'c' in function main
>

Wenn ich nun ausserhalb dieses Blocks eine andere Variable 'a'
haette, koennte ich sie vom inneren Block aus irgendwie erreichen?

Ciao Michael
From: maennig@anton.informatik.uni-dortmund.de (Olaf Maennig)
Newsgroups: de.comp.lang.c
Subject: Re: Verhalten von struct-Pointers
Date: 13 Aug 1992 10:12:30 GMT
Organization: CS Department, Dortmund University, Germany
Distribution: world
NNTP-Posting-Host: anton

Ja, ja, Leute, ich weiss! Da ist mir einfach ein Schreibfehler passiert.
Statt

|>     structure = (TEST*) calloc(1, sizeof(TEST*));

wollte ich wirklich 

       structure = (TEST*) calloc(1, sizeof(TEST));

schreiben.

Ausserdem ist mir noch ein Fehler unterlaufen:

|> structure-Werte k"onnen durch Angabe eines Pointers auf structure ge"andert
|> werden, warum aber wird structure auf NULL gesetzt, wenn freestruct() so
                                    ^
                                  nicht
|> aussieht:
|> 
|> void freestruct(TEST *s)
|> {
|>     free(s);
|>     s = 0x0;
|> }
|> 
|> und der Aufruf freestruct(structure) lautet?
|> Wird der Speicherplatz f"ur structure im zweiten Fall "uberhaupt
|> freigegeben?

Das kommt davon, wenn man so ein Posting erst dann schreibt, wenn man
eigentlich schon auf dem Weg zur S-Bahn sein sollte ...

Doch durch die _sehr_ sch"one Erkl"arung von Josef sind bei mir endlich alle
Klarheiten beseitigt! ;-) Dankesch"on!


Bleibt mir nur noch, einen kleinen Flame loszuwerden (auch wenn ich das
normalerweise nicht gerne tue, aber folgendes hat mich masslos ge"argert):

Auf die Frage hin habe ich Mails bekommen, die sowas von arrogant waren, dass
sie sich diese Herrschaften auch h"atten sparen k"onnen.
Dieses Forum existiert doch, um Fragen zu stellen und Antworten zu bekommen.
Es kann doch nicht jeder so fit sein, und Pointer sind nun mal kniffelig.
Also, warum nicht in einer anderen Art und Weise?

So, jetzt habe ich mich beruhigt. Solange es Leute wie Josef gibt, denke ich,
lohnt es sich, auch weiterhin die News zu lesen, aber wenn die 'Experten'
unter sich bleiben wollen, dann soll's gesagt werden; ich werde die Group
dann 'unsubscribe'-en ...

Ciao,
	Olaf
-- 

 ---------------------------------------------------------------------------
     _                   Department of Computer Science IV
    / \     |\/|         University of Dortmund, Germany
    \_/laf  |  |aennig   e-mail: maennig@siggi.informatik.uni-dortmund.de
 ---------------------------------------------------------------------------
From: ft1wf@ft1sparc.ft1.tu-harburg.de (Werner Fleck)
Newsgroups: de.comp.lang.c
Subject: Re: Verhalten von struct-Pointers
Date: 13 Aug 92 07:09:26 GMT
Reply-To: fleck@tu-harburg.dbp.de
Organization: Technische Universitaet Hamburg-Harburg

In article <16blbiINNjd7@fbi-news.Informatik.Uni-Dortmund.DE>, maennig@anton.informatik.uni-dortmund.de (Olaf Maennig) writes:
|> Hallo,
|> ich weiss, dass das jetzt wieder 'ne dumme Frage ist, aber ich verstehe
|> nicht, wie der Compiler struct-Pointer behandelt (oder Pointer allgemein?)
|> Und zwar nehme man folgendes Progr"ammchen:
|> 
|> [Programm geloescht]
|> 
|> void main(void)
|> {
|>     TEST *structure;
|> 
|>     structure = (TEST*) calloc(1, sizeof(TEST*));
                                                ^
Es muss heissen: "...sizeof(TEST)...". ---------^

|> 
|> structure-Werte k"onnen durch Angabe eines Pointers auf structure ge"andert
|> werden, warum aber wird structure auf NULL gesetzt, wenn freestruct() so
|> aussieht:
|> 
|> void freestruct(TEST *s)
|> {
|>     free(s);
|>     s = 0x0;
|> }
|> 
|> und der Aufruf freestruct(structure) lautet?
|> Wird der Speicherplatz f"ur structure im zweiten Fall "uberhaupt freigegeben?
|> 
Bei mir (gcc) wird structure nicht auf NULL gesetzt. Wenn dies
passiert, liegt es vermutlich an dem falschen Aufruf von calloc.
|> Fragend,
|> 	Olaf
|>
Antwortend,
    Werner
-- 
* Werner Fleck                            * email: fleck@tu-harburg.dbp.de *
* Arbeitsbereich Fertigungstechnik I      *                                *
* Technische Universitaet Hamburg-Harburg *                                *
* Denickestrasse 17                       * Tel.: +49 40 7718-3286         *
* D-2100 Hamburg 90                       * Fax:  +49 40 7718-2500         *
From: pmh@wasy.sub.org (Patrick M. Hausen)
Newsgroups: de.comp.lang.c
Distribution: world
Organization: Wacker Systemelektronik GmbH, Honsellstr. 1a, 7500 Karlsruhe 21
Subject: Re: 'static' innerhalb einer Schleife??
Reply-To: pmh@wasy.sub.org
X-Software: HERMES GUS 1.03 Rev. Apr 14 1992
Date: Mon, 17 Aug 1992 14:45:34 CEST

In <4jhV_9Aq3E@A-LINK-H.zer.sub.org>, m.mueller@a-link-h.comlink.de writes:

> Kann mir jemand erklaeren, wieso das geht?
> Im K&R 2. Ausgabe steht davon Nichts.
> Ich benutzte den Turbo C++ V1.00 mit der Option ANSI-C only.
> 
> main()
> {
> 	int a = 1;
> 	while (a < 4)
> 	{
> 		int b=1;
> 		static int c=1;
> 
> 			a++;
> 			b++;
> 			c++;
> 	}
> 	a = c;        /*   In dieser Zeile...*/
> }
> 
> >> Die Fehlermeldung lautet:
> >> Undefined symbol 'c' in function main

Klaro!

Auch in K&R steht schon, dasz man am Anfang jedes Blocks Variablen
definieren kann. Der Gueltigkeitsbereich dieser erstreckt sich bis zum
Ende des Blocks.

--> Auszerhalb der while-Schleife ist 'c' unbekannt, folglich gibt's eine
    Fehlermeldung.

Grusz, Paddy
-- 
Patrick M. Hausen * Support Unix und Netzwerke * Wacker Systemelektronik GmbH
 Honsellstr. 1a * D-W7500 Karlsruhe 21 * Phone: +49-721-955600 * Fax: 9556050
   Email (office): pmh@wasy.sub.org * Email (private): pmh@cutie.ka.sub.org
Newsgroups: de.comp.lang.c
From: klaus@soonix.nbg.sub.org (Klaus Baldermann)
Subject: Re: Suche Algorithmus (DRINGEND!!!)
Organization: Some Oldster's Occasional Nocturnal Information eXchange
X-Newsreader: Tin 1.1 PL4
Date: Thu, 13 Aug 1992 21:58:10 GMT

pom@anke.imsd.uni-mainz.DE (Prof. Dr. Klaus Pommerening) writes:
: Moeglichkeiten gibt es naemlich. Da Sie mit der Zeit knapp sind, werden
: Sie kaum Zeit haben, diese alle durchzulesen.

Ja schon, aber wozu gibt es Spellingchecker (neudeutsch fuer:
Rechtschreibpruefprogramme) :-)

Gruesse
Klaus
--
klaus@soonix.nbg.sub.org / k.baldermann@msn.rmi.de / K.BALDERMANN@LINK-N.ZER
Newsgroups: de.comp.lang.c
From: Josef Moellers <mollers.pad@sni.de>
Subject: Re: 'static' innerhalb einer Schleife??
Date: Tue, 18 Aug 1992 12:34:08 GMT
Organization: Siemens Nixdorf Info.Sys. AG, Paderborn, Germany

In <zrawi01.714125900@indiaka> zrawi01@indiaka.zdv.uni-tuebingen.de (J. Wiedmann) writes:

>In <H.4S1Lr7JKuFQ@wasy.sub.org> pmh@wasy.sub.org (Patrick M. Hausen) writes:

>>Auch in K&R steht schon, dasz man am Anfang jedes Blocks Variablen
>>definieren kann. Der Gueltigkeitsbereich dieser erstreckt sich bis zum
>>Ende des Blocks.

>Sehr nuetzlich ist das z.B. um innerhalb einer Funktion mehr Register-Variablen
>zu verwenden als eigentlich moeglich sind. Manche C-Compiler (z.B. Aztec-C auf
>dem Amiga) verwenden dann ein Register innerhalb der verschiedenen Bloecke
>fuer verschiedene Variablen.

Nicht nur das, sondern auch:

	func()
	{
		int	a[1000];
		int	b[1000];

		/* code, der weder a noch b benutzt */

		/* code, der nur a benutzt */

		/* code, der weder a noch b benutzt */

		/* code, der nur b benutzt */

		/* code, der weder a noch b benutzt */
	}

	kann man ersetzten durch

	func()
	{
		/* code, der weder a noch b benutzt */

		{
			int a[1000];

			/* code, der nur a benutzt */
		}

                /* code, der weder a noch b benutzt */

		{
			int	b[1000];

			/* code, der nur b benutzt */
		}

                /* code, der weder a noch b benutzt */
        }

Dann benutzen a und b den selben Stack-Bereich.
-- 
| Josef Moellers		| c/o Siemens Nixdorf Informationssysteme AG  |
|  USA: mollers.pad@sni-usa.com	| Abt. STO-XS 113	   | Riemekestrasse   |
| !USA: mollers.pad@sni.de	| Phone: (+49) 5251 835124 | D-4790 Paderborn |
Newsgroups: de.comp.lang.c
From: krey@ira.uka.de (Andreas Krey)
Newsgroups: de.comp.lang.c
Subject: Re: Verhalten von struct-Pointers
Date: 13 Aug 1992 08:18:25 GMT
Organization: University of Karlsruhe, Comp. Sc. Dept., FRG
Distribution: world
NNTP-Posting-Host: i30s20.ira.uka.de

In article <16blbiINNjd7@fbi-news.Informatik.Uni-Dortmund.DE>, maennig@anton.informatik.uni-dortmund.de (Olaf Maennig) writes:
|> Hallo,
|> ich weiss, dass das jetzt wieder 'ne dumme Frage ist, aber ich verstehe
|> nicht, wie der Compiler struct-Pointer behandelt (oder Pointer allgemein?)
|> Und zwar nehme man folgendes Progr"ammchen:
|> 

Nun ist zwar schon einiges gutes gesagt worden (speziell die
Bilderchen von Josef Moellers <mollers.pad@sni.de> waren echt gut),
aber ein Haerchen bleibt mir noch aus der Suppe zu ziehen:
|> 
|> typedef struct test
|> {
|>     int   integer;
|>     char  character;
|> } TEST;
[.......]
|> void main(void)
|> {
|>     TEST *structure;
|> 
|>     structure = (TEST*) calloc(1, sizeof(TEST*));
|> 
Hier wird naemlich nicht genug Speicherplatz fuer ein `struct test'
alias `TEST' angefordert, sondern nur genug fuer einen Zeiger drauf.
Richtig waere:
       structure = (TEST*) calloc(1, sizeof(TEST));
Man beachte die Abwesenheit des einen Sternchens^hier!
sizeof(TEST) ist meistens 8, sizeof(TEST*) meist 4 (typische
UNIX-Systeme angenommen).

[......]

-- 
Andreas

Hacker sucht Arbeit ab 1.10. in Karlsruhe.
Biete C, C++, Unix, XWindows-Kenntnisse.

#include <disclaimer.h>
Date: Wed, 12 Aug 1992 22:18:00 CET
From: m.mueller@a-link-h.comlink.de
Reply-To: m.mueller@a-link-h.comlink.de
Distribution: world
Newsgroups: de.comp.lang.c
Subject: 'static' innerhalb einer Schleife??
Organization: Aquila Jugendmailboxprojekt, Langenhagen
Content-Length: 472     
X-Gateway: UU uzercp [UZERCP V3.97]


Halloechen,

Kann mir jemand erklaeren, wieso das geht?
Im K&R 2. Ausgabe steht davon Nichts.
Ich benutzte den Turbo C++ V1.00 mit der Option ANSI-C only.

main()
{
	int a = 1;
	while (a < 4)
	{
		int b=1;
		static int c=1;

			a++;
			b++;
			c++;
	}
	a = c;        /*   In dieser Zeile...*/
}

>> Die Fehlermeldung lautet:
>> Undefined symbol 'c' in function main


Ergibt sich daraus ein Geschwindigkeitsvorteil?
(kann ja als register verwendet werden)


Ciao Michael
From: pmh@wasy.sub.org (Patrick M. Hausen)
Newsgroups: de.comp.lang.c
Subject: Re: Verhalten von struct-Pointers
Date: 21 Aug 92 02:04:24 GMT
	<wd.713770977@tukan>
Reply-To: pmh@wasy.sub.org
Organization: Wacker Systemelektronik GmbH, Honsellstr. 1a, 7500 Karlsruhe 21
X-Software: HERMES GUS 1.03 Rev. Apr 14 1992

In <wd.713770977@tukan>, wd writes:

> >void freestruct(TEST *s)
> >{
> >    free(s);
> >    s = 0x0;
> >}
> 
> Wenn man "free (object)" macht und danach versucht, diesem Objekt 
> (das ja nun keinen gueltigen Speicherplatz mehr hat!) einen  Wert
> zuzuweisen,  darf man nicht mehr  "warum passiert dies oder das?"
> fragen - danach kann alles passieren. 
> 
> Das ist ein BUG!

.Oberlehrer ON

Falsch!

free(s) gibt den Speicherplatz des Objekts frei, auf das s zeigt.
Dem Pointer s kann man danach durchaus den Wert 0 zuweisen.
Was nicht ginge, waere *s = 0x0;

Grusz, Paddy
-- 
Patrick M. Hausen * Support Unix und Netzwerke * Wacker Systemelektronik GmbH
 Honsellstr. 1a * D-W7500 Karlsruhe 21 * Phone: +49-721-955600 * Fax: 9556050
   Email (office): pmh@wasy.sub.org * Email (private): pmh@cutie.ka.sub.org
Newsgroups: de.comp.lang.c
From: holger@zelator.in-berlin.de (Holger Lesch)
Subject: XOpen gencat, catopen f. sgi IRIS-Indigo ?
Organization: Puplic-Access-Xenix-System
Date: Sun, 23 Aug 92 10:33:05 GMT


Hallo da draussen !

Ich suche fuer die SiliconGraphics Iris-Indigo das XOpen-kompatible
Paket zur unterstuetzung von sprachunabhaengigen Message-Katalogen,
also das Kommando gencat und die Library-Funktionen catopen usw....

Jede Hilfe ist willkommen....

Holger
-- 
#############################################################
# Holger Lesch              email (privat) :                #
# Sybelstrasse 23               holger@zelator.in-berlin.de #
# W-1000 Berlin             email (non-privat):             #
# Tel. (030) 3243615                   holger@kom.sietec.de #
#############################################################
From: bof@midget.saar.de (Patrick Schaaf)
Newsgroups: de.comp.lang.c
Subject: Re: 'static' innerhalb einer Schleife??
Date: 14 Aug 92 09:31:46 GMT
Organization: Yoyodyne Posting Systems, Midget HQ

MoinMoin

m.mueller@a-link-h.comlink.de writes:
>Kann mir jemand erklaeren, wieso das geht?
>main()
>{
>	int a = 1;
>	while (a < 4)
>	{
>		static int c=1;
>			a++;
>			c++;
>	}
>	a = c;        /*   In dieser Zeile...*/
>}
>>> Die Fehlermeldung lautet:
>>> Undefined symbol 'c' in function main

Aeh, demnach geht es also nicht, oder? Die Definition von c innerhalb des
Blocks von while hat nur Gueltigkeit fuer den scope des while-blocks,
ausserhalb existiert die Variable nicht. Bei folgendem Konstrukt:
...
{ int c=23;
  { int c=42; }
  printf("%d\n", c);
}
wuerde 23 ausgegeben, nicht 42.

>Ergibt sich daraus ein Geschwindigkeitsvorteil?
>(kann ja als register verwendet werden)

Woraus? Wenn der Compiler ordentlich optimiert, kann er auch blockueber-
greifend Sachen in Register stopfen, eine "innere" Definition aendert
daran eher nix (ein Compilerbauer moege mich korrigieren). Variablen
innerhalb von Bloecken zu definieren erhoeht aber (insbesondere bei
groesseren Funktionen) die Lesbarkeit und Sicherheit des Codes.

Sollten Deine Fragen damit noch nicht beantwortet sein, stell sie bitte
nochmal, etwas praeziser.

Gruss
  Patrick
-- 
bof@midget.saar.de      /   \      I've just spent an hour in Your head.
Saarbruecken, De     .^/ -.- \      Believe me, I've been in nicer places.
Patrick Schaaf      / /       \        (kid eternity)
-                  this line intentionally blanked right                  -
From: bof@midget.saar.de (Patrick Schaaf)
Newsgroups: de.comp.lang.c
Subject: Re: Verhalten von struct-Pointers
Date: 14 Aug 92 09:23:49 GMT
Organization: Yoyodyne Posting Systems, Midget HQ

maennig@anton.informatik.uni-dortmund.de (Olaf Maennig) writes:
>ich weiss, dass das jetzt wieder 'ne dumme Frage ist, aber ich verstehe
>nicht, wie der Compiler struct-Pointer behandelt (oder Pointer allgemein?)

Dumme Fragen gibt's an sich nicht...

>Und zwar nehme man folgendes Progr"ammchen:
(grabsch)

>typedef struct test
>{
>    int   integer;
>    char  character;
>} TEST;
>
>void main(void)
>{
>    TEST *structure;
>
>    structure = (TEST*) calloc(1, sizeof(TEST*));

poof! Du nimmst Dir 1*sizeof(TEST*) bytes Speicher, willst in Wirklichkeit
aber 1*sizeof(TEST) bytes. Mit obigem malloc bekommst Du nur einen Zeiger
(TEST *) auf ein struct test allokiert. Du willst aber ein TEST haben,
auf das Du dann structure zeigen laesst.
Nicht dass das etwas mit Deiner Frage zu tun haette...

>    change1(structure);
>    change2(structure);
>    freestruct(&structure);

ist soweit (den modifizierten malloc vorausgesetzt) korrekt.

>structure-Werte k"onnen durch Angabe eines Pointers auf structure ge"andert
>werden, warum aber wird structure auf NULL gesetzt, wenn freestruct() so
>aussieht:
>void freestruct(TEST *s)
>{
>    free(s);
>    s = 0x0;
>}
>und der Aufruf freestruct(structure) lautet?

Wird es? Bei mir (SCO, gcc 2.1) aendert sich der Wert von structure sinnvoller-
weise nicht. Die Struktur wird natuerlich freigegeben, INNERHALB von
freestruct() wird s natuerlich NULL, aber in main() muss es den alten Wert
behalten. Wenn es das nicht tut, hat der Compiler ein Problem (vorausgesetzt,
dass Dein calloc() korrigiert wurde - wenn nicht, kann das erzeugte Programm
so ziemlich alles machen, zum Beispiel Dir ein Bier spendieren).

>Wird der Speicherplatz f"ur structure im zweiten Fall "uberhaupt freigegeben?

Jein. Er wird genauso wie im ersten Fall freigegeben, aber um Dir eventuelle
Verwirrung zu ersparen, wenn Du das ueberpruefen willst - der Speicher wird
meist NICHT an das Betriebssystem zurueckgegeben, sondern nur bei weiteren
malloc()s recycled.

Gruss
  Patrick

-- 
bof@midget.saar.de      /   \      I've just spent an hour in Your head.
Saarbruecken, De     .^/ -.- \      Believe me, I've been in nicer places.
Patrick Schaaf      / /       \        (kid eternity)
-                  this line intentionally blanked right                  -
Newsgroups: de.comp.lang.c
From: duening@ibr.cs.tu-bs.de (Lars Duening)
Subject: Re: 'static' innerhalb einer Schleife??
Reply-To: duening@ibr.cs.tu-bs.de (Lars Duening)
Organization: TU Braunschweig, Informatik (Bueltenweg), Germany
Date: Thu, 13 Aug 1992 17:59:07 GMT

In article <4jhV_9Aq3E@A-LINK-H.zer.sub.org> m.mueller@a-link-h.comlink.de 
writes:

> Kann mir jemand erklaeren, wieso das geht?
> Im K&R 2. Ausgabe steht davon Nichts.
> Ich benutzte den Turbo C++ V1.00 mit der Option ANSI-C only.

> main()
> {
> 	int a = 1;
> 	while (a < 4)
> 	{
> 		int b=1;
> 		static int c=1;
> 
> 			a++;
> 			b++;
> 			c++;
> 	}
> 	a = c;        /*   In dieser Zeile...*/
> }
> 
> >> Die Fehlermeldung lautet:
> >> Undefined symbol 'c' in function main

Die { } nach dem while() eroeffnen einen neuen Block (so nenne ich es 
jedenfalls), so dass die in ihm deklarierten Identifier auch nur in ihm
sichtbar bleiben. Es ist genau wie mit den 'normalen' lokalen Variablen
einer Funktion, nur eben noch eine Stufe tiefer.

> Ergibt sich daraus ein Geschwindigkeitsvorteil?
> (kann ja als register verwendet werden)

Haengt vom Compiler ab, wuerde ich sagen. Ein schlechter Compiler kann daraus
einen kompletten Wechsel des Stackframes und damit einen Nachteil machen.
--
Lars Duening; Am Wendenwehr 25  |  Email: duening@eis.cs.tu-bs.de
W3300 Braunschweig              |  Voice: 351-345693
Newsgroups: de.comp.lang.c