[C] gmp_printf() geeft segfault

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor mijn profielwerkstuk voor de middelbaar school wilde ik de GNU Multi-Precision BigNum Library (gmp) gebruiken in C. Dit ging allemaal prima. Op school werk ik op windows (en thuis tijdelijk ook) en daarom gebruik ik Dev-C++ in combinatie met msys.

Ik heb gmp gedownload, 'uitgepakt' en daarna 'configure --prefix=/c/programming/dev-cpp --enable-cxx' daarna 'make' en daarna 'make check' (allemaal passes) en daarna 'make install'. Dit ging allemaal prima na wat hindernissen (lees: uren kl*ten). Daarna ging ik mijn eerste programmatje schrijven in C met behulp van gmp.

Dat werd dit programma:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdarg.h>
#include <gmp.h>

//#include "functions.h"

int main(int argc, char* argv[])
{

    
      mpz_t m;
      mpz_init(m);
      mpz_set_str(m, "0", 10);
      
      {

            gmp_printf("%Z", m);
      }  
      return 0;
}


Dit programma geeft zelf geen segfault maar geeft als output ('[null]'), maar vervanging van nul door een andere waarde (zowel positief als negatief) geeft een segfault.

Om hier tegen wat te doen heb ik op het internet gezocht en gespeeld met --enable-alloca bij de configure met alle drie de opties maar met hetzelfde resultaat.

Wat is hier aan de hand en wat kan ik hier tegen doen?

Informatiesyste(e)m(en): Windows XP 64-bits en Phenom II X4 en Windows XP Home en onbekend (single core Intel denk ik), zelfde foutmelding.

Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Wat geeft de functie op regel 13 als functieresultaat?
Wat is het resultaat als je regel 13 wist?

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Icelus schreef op zaterdag 07 november 2009 @ 22:24:
Wat geeft de functie op regel 13 als functieresultaat?
Wat is het resultaat als je regel 13 wist?
Zowel bij invoering van nul als een andere waarde geeft de functie een nul terug wat ook correct is volgens de gmp-handleiding.

Daarnaast zag ik dat in een voorbeeld gmp 'mpz_out_str (stdout, 10, prime);' gebruikt en dat voorbeeld werkt ook. Dat heb ik dus geprobereerd en dit geef output zonder te segfaulten.

De code die ik nu heb is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdarg.h>
#include <gmp.h>

//#include "functions.h"

int main(int argc, char* argv[])
{
      int i;
      mpz_t m;
      mpz_init(m);
      i = mpz_set_str(m, "999999999999999999999999999999999999999999999999999999999999999999999999", 10);

      printf("%d\n", i);
      mpz_out_str (stdout, 10, m);
      {
            gmp_printf("%Z", m);
      }
      return 0;
}


en de output is: "0\n999999999999999999999999999999999999999999999999999999999999999999999999" en dan segfault of als er een nul staat i.p.v. 999... "0\n0<null>" en geen segfault . Hoewel ik het natuurlijk alleen met die functie (mpz_out_str) en soortgelijke functies zou kunnen stellen zou ik toch graag de gmp_printf gebruiken aangezien dit makkelijker is en het zou moeten werken.

Acties:
  • 0 Henk 'm!

  • alx
  • Registratie: Maart 2002
  • Niet online

alx

Ik krijg ook rare output, maar geen segfault, maar het is een kwestie van de gmp_printf() manual lezen:
code:
1
2
A format specification is of the form
% [flags] [width] [.[precision]] [type] conv

Jij geeft alleen een type op, terwijl je iig een conv moet opgeven.
Wat krijg je als je jouw gmp_printf() call vervangt door dit:
code:
1
gmp_printf("%Zd", m);

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
alx schreef op zondag 08 november 2009 @ 00:48:
Ik krijg ook rare output, maar geen segfault, maar het is een kwestie van de gmp_printf() manual lezen:
code:
1
2
A format specification is of the form
% [flags] [width] [.[precision]] [type] conv

Jij geeft alleen een type op, terwijl je iig een conv moet opgeven.
Wat krijg je als je jouw gmp_printf() call vervangt door dit:
code:
1
gmp_printf("%Zd", m);
Dat werkt! Heel erg bedankt! _/-\o_ Volgende keer de manual aandachtiger lezen. |:(