🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #144

Re: Borland C++ 3.1, Fehler in Speicherverwaltung?

#144
From: Michael Strauch
Date: Wed, 20 Sep 1995 12:31
79 lines
3459 bytes
Jens Ehlers (Ehlers@tu-harburg.d400.de) wrote:

> Bei einem von mir geschriebenen Programm bekamm ich zur laufzeit 
> die Meldung:

>   Speicherzuordnugsfehler
>   COMMAND kann nicht geladen werden, System angehalten

> Ich habe das Programm schrittweise verkleinert, um den Fehler einzugrenzen, 
> was mich viele Stunden Arbeit gekostet hat.
> Die for Schleife hat den Zweck den Fehler sicherer zu bemerken.
> Das Programmfragment (s. unten) enth"alt mit hoher Sicherheit keinen Fehler.
> Ich habe es auf drei verschiedene Unix Workstations (Apollo, HP 700, IBM)
> "ubertragen. Auf allen drei Rechnertypen l"auft das Programm problemlos.
> Das Syntaxanalysewerkzeug {\tt lint} endeckt keine Fehler.
> Das Laufzeitanalysesystem Insight (IBM/AIX)  hat keine
> Speicherbereichs"uberschreitungen oder andere Fehler festgestellt:
> ...
> Mit Borland C++ 3.1 bekomme ich jedoch weiterhin den Laufzeitfehler,
> allerdings nur wenn ich das Speichermodell Large benutze.

> Meine Frage/Bitte:
>   - Ist die Speicherverwaltung von Borland C++ fehlerhaft?

Jein. Im Gegensatz zu Deinen C-Compilern auf den Unix-Workstations
(welche garantiert alle 32-bittig sind), ist Borland C 3.1 nur
16-bittig. Ob man das als Fehler ansehen will, bleibt wohl jedem
selbst ueberlassen. In der Praxis heisst das i. W.: kein "malloc" mit
mehr als 64 KB!

> ...

> #include<stdlib.h>
> #include<stdio.h>

> #define FREE(ptr) if (ptr) {free(ptr);ptr=NULL;}
> #define ANZ 20000

> int  main(int argc, char *argv[]);
> void fehler2 (char *funktion, char *text);
> void messe(int cfg[ANZ]);

> /*************************************************************/
> int main(int argc, char *argv[]){
> int cfg[ANZ];
> messe(cfg);
> return 0;}
> /*************************************************************/
> void messe(int cfg[ANZ]){
> short *werte_b=NULL;   /* Basis des Speicherbereichs  */
> float *ptr2=NULL;
> unsigned *dauer=NULL;
> unsigned long  werte_n;
> unsigned long n_zeiten;
> int n_kanaele=2;

> for (n_zeiten=100;n_zeiten<=40000;n_zeiten+=100){
> printf("**************************\nn-zeiten= %f\n",1.0*n_zeiten);
> werte_n  = (n_zeiten*n_kanaele   )*sizeof(short);

> /* Speicher anfordern */
> printf("werte_n=%lu\n",werte_n);
> werte_b   = (short *) malloc(werte_n);

> ...

Hier haben wir es ja: n_zeiten=40000, n_kanaele=2, sizeof(short)=2, gibt
werte_n=160000, also deutlich zuviel fuer das malloc.

Tip von mir: besorg Dir GNU-C/C++, dann hast Du solche Probleme nicht.


- Michael -
--
***************************************************************************
*   Michael Strauch            *  email:                                  *
*   University of Dortmund     *  strauch@emmy.mathematik.uni-dortmund.de *
*   Department of Mathematics  *                                          *
***************************************************************************
Technical Details
Message-ID: <43p1ij$lpm@nx2.hrz.uni-dortmund.de>
Path: arc1-ca.pugleaf.net!Uni-Dortmund.DE!strauch
References: <43otte$ndb@rztsun.tu-harburg.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!Uni-Dortmund.DE!strauch
From: strauch@emmy.mathematik.uni-dortmund.de (Michael Strauch)
Newsgroups: de.comp.lang.c++,;,de.comp.lang.c
Subject: Re: Borland C++ 3.1, Fehler in Speicherverwaltung?
Followup-To: de.comp.lang.c++,;,de.comp.lang.c
Date: 20 Sep 1995 12:31:15 GMT
Organization: HRZ, University of Dortmund, Germany
Message-ID: <43p1ij$lpm@nx2.hrz.uni-dortmund.de>
References: <43otte$ndb@rztsun.tu-harburg.de>
NNTP-Posting-Host: emmy.mathematik.uni-dortmund.de
X-Newsreader: TIN [version 1.2 PL2]