Die Mathe-Redaktion - 18.06.2019 03:44 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktAnmeldung MPCT Sept.
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 293 Gäste und 4 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C: unsigned long long drucken
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule C: unsigned long long drucken
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5018
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-05-25 13:34


Hallo,

ich möchte eine 64-Bit-Variable in einen char-String t drucken:
C
unsigned long long int x;
char t[30];
...
sprintf(t, "%llu", x);
...

Im String t steht dann aber \(x \mod 2^{32}\). Was mache ich falsch? (Ich meine mich zu erinnern, dass soetwas früher immer geklappt hat.)

Danke und Grüße
StrgAltEntf



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2613
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-05-25 13:41


Ich sehe keinen Fehler. Könntest du ein vollständiges Minimalbeispiel posten?


-----------------
⊗ ⊗ ⊗



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 383
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2019-05-25 13:55


Hier mal ein funktionierendes Minimalbeispiel:
C
#include <stdio.h>
 
int main(void) {
  unsigned long long int x;
  char t[30];
  x = 1234567890123456789ull;
  sprintf(t, "%llu", x);
  printf("%s\n", t);
  return 0;
}



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5018
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, vom Themenstarter, eingetragen 2019-05-25 13:55


2019-05-25 13:41 - ligning in Beitrag No. 1 schreibt:
Ich sehe keinen Fehler. Könntest du ein vollständiges Minimalbeispiel posten?

Danke! Aber das war eigentlich schon das Minimalbeispiel. Ich habe eine Funktion definiert, die eine 64-Bit-Zahl in einen AnsiString konvertiert. (Ich programmiere mit dem C++-Builder von Borland.)
C
AnsiString LongToStr(unsigned long long int x){
  AnsiString S;
  unsigned long int y = x; // nur zu Debug-Zwecken
  char t[30];
 
  sprintf(t, "%llu", x);
  S = t;
  return S;
}

Wenn ich mir dies im Debugger ansehe, steht in t (und S) hinterher das, was in y, und nicht das, was in x steht.

[Die Antwort wurde nach Beitrag No.1 begonnen.]



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 383
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2019-05-25 14:01


2019-05-25 13:55 - StrgAltEntf in Beitrag No. 3 schreibt:
Aber das war eigentlich schon das Minimalbeispiel.

Ein Minimalbeispiel sollte man kompilieren und ausführen können.



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5018
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2019-05-25 14:44


2019-05-25 14:01 - zippy in Beitrag No. 4 schreibt:
Ein Minimalbeispiel sollte man kompilieren und ausführen können.

Auch dir danke!

Ich habe jetzt dein Beispielprogramm als Konsolenprogramm compiliert. Allerdings muss ich dann noch "#include <vcl.h>" davor schreiben, sonst compiliert Borland-C++-Builder nicht, und es kommt zu folgender Fehlermeldung:


Mit #include <vcl.h> wird das Programm dann compiliert zu project11.exe, und wenn ich es ausführe, erhalte ich:




  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2613
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2019-05-25 14:49


Das sollte definitiv funktionieren. Offenbar versteht der Compiler unsigned long long, der Debugger zeigt es ja auch an, aber sprintf hat damit ein Problem. Mein Tipp wäre, dass der Compiler bzw. eher seine Standardlibrary einfach schon ein bisschen angestaubt ist und das deshalb nicht funktioniert. unsigned long long gibt es in C zwar schon seit C99, aber in C++ wurde das erst mit dem C++11-Standard übernommen.



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5018
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, vom Themenstarter, eingetragen 2019-05-25 16:30


2019-05-25 14:49 - ligning in Beitrag No. 6 schreibt:
Mein Tipp wäre, dass der Compiler bzw. eher seine Standardlibrary einfach schon ein bisschen angestaubt ist und das deshalb nicht funktioniert. unsigned long long gibt es in C zwar schon seit C99, aber in C++ wurde das erst mit dem C++11-Standard übernommen.

Dann muss ich wohl damit leben frown

Habe mir jetzt mein eigenes sprintf gebastelt:
C
AnsiString LongToStr(unsigned long long int x){
  AnsiString S;
  char t[30];
  int i;
 
  if(x == 0)
    return "0";
  t[29] = 0;
  for(i=28; x; i--){
    t[i] = x%10 + '0';
    x /= 10;
  }
  S = t + i + 1;
  return S;
}
Vielen Dank für eure Mühe!

Grüße
StrgAltEntf



  Profil  Quote  Link auf diesen Beitrag Link
rlk
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.03.2007
Mitteilungen: 10491
Aus: Wien
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, eingetragen 2019-05-25 18:17


Hallo StrgAltEntf,
der String t wird auf dem Stack angelegt, es gibt keine Garantie, dass er nach dem Verlassen der Funktion unverändert bleibt.

Servus,
Roland




  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5018
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, vom Themenstarter, eingetragen 2019-05-25 19:00


2019-05-25 18:17 - rlk in Beitrag No. 8 schreibt:
der String t wird auf dem Stack angelegt, es gibt keine Garantie, dass er nach dem Verlassen der Funktion unverändert bleibt.

Servus!

Dieser Problematik bin ich mir bewusst. Allerdings brauche ich den Inhalt des t-Strings später nicht mehr. Ein AnsiString ist auch nicht einfach nur ein char-Pointer, sondern viel mehr. Es ist ein C++-Objekt mit vielen netten Features. Eine Verarbeitung von Zeichenketten ist mit AnsiString-Variablen sehr bequem (für den Programmierer). In einer AnsiString-Variable ist der char-String sozusagen drin, und mit dem Befehl S = t + i + 1 kann man S mit dem String t[i+1], t[i+2], ..., t[29] befüllen. (Entschuldigt bitte, falls meine Ausdrucksweise hier etwas laienhaft sein sollte.) Allerdings sollte man sich hüten, in langen Schleifen AnsiString-Variablen zu verwenden, da das Rechnen damit sehr zeitaufwändig ist.

Grüße
StrgAltEntf



  Profil  Quote  Link auf diesen Beitrag Link
pzktupel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 02.09.2017
Mitteilungen: 939
Aus: Thüringen,Erfurter Raum
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, eingetragen 2019-05-25 19:38


Sorry Str, das kann ich nicht verfolgen.
Ich nehme an, eine Zahl soll in ein String verwandelt werden und hier wird Zeichen für Zeichen von rechts nach links abgeschnitten und zum String hinzugefügt.

In Basic kenn ich das nur sofort als Z=STR(Nummer), Gegenstück Nummer=VAR(Z), Z ist der String.






-----------------
Pech in der Liebe , Glück im Verlieren !!!



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5018
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, vom Themenstarter, eingetragen 2019-05-25 20:51


2019-05-25 19:38 - pzktupel in Beitrag No. 10 schreibt:
Sorry Str, das kann ich nicht verfolgen.
Ich nehme an, eine Zahl soll in ein String verwandelt werden und hier wird Zeichen für Zeichen von rechts nach links abgeschnitten und zum String hinzugefügt.

In Basic kenn ich das nur sofort als Z=STR(Nummer), Gegenstück Nummer=VAR(Z), Z ist der String.

Die Feinheiten von Basic kenne ich leider nicht. Ich kann nur sagen, wie es bei C/C++ ist. Die Konvertierung von einer Zahl in einen AnsiString erfolgt über die Funktion IntToStr und umgekeht durch StrToInt. Das funktioniert (bei mir) aber nicht mit 64-Bit-Zahlen; deshalb habe ich es selbst gebastelt. Vielleicht ist das alles auch Borland-spezifisch. Zum Beispiel kann man folgendes programmieren.
Borland C++
main(){
  AnsiString A, B, C, D;
  char z;
  A = "Hello";
  B = "World";
  C = IntToStr(2019);
  D = A + " " + B + " " + C;
  z = A[1]; // Ja, tatsächlich A[1] und nicht A[0]
}
D enthält dann "Hello World 2019". Um Speicherplatzverwaltung braucht sich der Programmierer nicht zu kümmern. z enthält 'H'.



  Profil  Quote  Link auf diesen Beitrag Link
pzktupel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 02.09.2017
Mitteilungen: 939
Aus: Thüringen,Erfurter Raum
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, eingetragen 2019-05-25 22:50


Nachruf: Bei Basic klappt das wie erwartet mit 64bit Zahlen.


INPUT SUM
Z=STR(SUM)
PRINT Z
SLEEP


? 513144441791316479
513144441791316479



-----------------
Pech in der Liebe , Glück im Verlieren !!!



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5018
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, vom Themenstarter, eingetragen 2019-05-25 23:32


2019-05-25 22:50 - pzktupel in Beitrag No. 12 schreibt:
Nachruf: Bei Basic klappt das wie erwartet mit 64bit Zahlen.


INPUT SUM
Z=STR(SUM)
PRINT Z
SLEEP


? 513144441791316479
513144441791316479


Du Glücklicher!  smile

Dann sage ich auch mal SLEEP und hake hier ab smile



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26771
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, eingetragen 2019-05-26 01:35


Kommt auf die Compilerversion an.
Bei mir funktioniert das (Tokio-Version):
C++
#include <iostream>
 
using namespace std;
 
int main()
{
   unsigned long long int L1 = 0xDCBA876543218765;
   char sx[100];
   char sd[100];
   sprintf(sx, "%llx", L1);
   sprintf(sd, "%llu", L1);
   cout << L1 << "\n" << sd << "\n" << sx << "\n";
   return 0;
} // main
Ausgabe
15905173903000045413
15905173903000045413
dcba876543218765



-----------------
Bild



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf hat die Antworten auf ihre/seine Frage gesehen.
StrgAltEntf hatte hier bereits selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]