Echte Zufallszahlen von Server abrufen
-
Ich wollte gerne echte Zufallszahlen von dem auf dieser Seite beworbenen Server einbinden können:
Es war auch eine Beispieldatei bei:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <stdio.h> #include <tchar.h> #include "C:\MinGW\lib\c\qrbg-c.h" int _tmain(int argc, _TCHAR* argv[]) { defineServer("random.irb.hr", 1227); defineUser("Username", "Password"); int ret, val; ret = getInt(&val); printf("Ret val: %d, Rnd val: %d \n", ret, val); return 0; }
Username und Password hab ich natürlich entsprechend ersetzt.
Beim Compilen bekomme ich aber folgenden Fehler:
C:\MinGW\lib\c\qebg-c.h:40:8: Fehler expected identifier or <<(>> bevore String constantUnd das noch an einigen weiteren Stellen (41:8 , 42:8 47:8 ...)
Hier die .h-Datei:
// The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the CLIENTDLLC_EXPORTS // symbol defined on the command line. this symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // CLIENTDLLC_API functions as being imported from a DLL, whereas this DLL sees symbols // defined with this macro as being exported. #ifdef CLIENTDLLC_EXPORTS #define CLIENTDLLC_API __declspec(dllexport) #else #define CLIENTDLLC_API __declspec(dllimport) #endif // size_t, byte declaration #include <stddef.h> typedef unsigned char byte; // // return values for exported functions // #define ERR_OK 0 #define ERR_NOT_INITIALIZED 1 #define ERR_INVALID_ARGUMENT 2 #define ERR_NETWORK_FAILED 3 #define ERR_CONNECT_FAILED 4 #define ERR_COMMUNICATION_FAILED 5 // 60 + enum QRBG::ServerResponseCodes #define ERR_SERVICE_DENIED_BASE 60 #define ERR_SERVICE_DENIED_SERVER_STOPPING 61 #define ERR_SERVICE_DENIED_SERVER_ERROR 62 #define ERR_SERVICE_DENIED_UNKNOWN_OP 63 #define ERR_SERVICE_DENIED_ILL_FORMED_REQ 64 #define ERR_SERVICE_DENIED_TIMOUT 65 #define ERR_SERVICE_DENIED_AUTH_FAILED 66 #define ERR_SERVICE_DENIED_QUOTA_EXCEEDED 67 // // initialization functions // extern "C" CLIENTDLLC_API int defineCache(unsigned int cacheSize); extern "C" CLIENTDLLC_API int defineServer(const char* qrbgServerAddress, unsigned int qrbgServerPort); extern "C" CLIENTDLLC_API int defineUser(const char* qrbgUsername, const char* qrbgPassword); // // single value getters // extern "C" CLIENTDLLC_API int getByte(byte* value); extern "C" CLIENTDLLC_API int getInt(int* value); extern "C" CLIENTDLLC_API int getLongInt(long* value); extern "C" CLIENTDLLC_API int getFloat(float* value); extern "C" CLIENTDLLC_API int getDouble(double* value); // // multiple value (buffer/array) getters // extern "C" CLIENTDLLC_API int getBytes(byte* buffer, size_t count); extern "C" CLIENTDLLC_API int getInts(int* buffer, size_t count); extern "C" CLIENTDLLC_API int getLongInts(long* buffer, size_t count); extern "C" CLIENTDLLC_API int getFloats(float* buffer, size_t count); extern "C" CLIENTDLLC_API int getDoubles(double* buffer, size_t size);
Scheinbar kann er mit dem Begriff Extern nicht umgehen ?!?
-
Das
extern "C"
ist C++. Merkwürdigerweise scheint der Header ansonsten C zu sein, die Library ist auch C (deswegen extern "C"...). Vielleicht hilft es, wenn du die "C" überall wegmachst.Der normale Weg für einen in C und C++ nutzbaren Header wäre, dass man das
extern "C"
in#ifdef __cplusplus
kapselt.Achso, das Unterforum ist, wie der Name schon sagt, für C# und .NET, nicht für C- oder C++-Fragen gedacht...
-
Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C (C89, C99 und C11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Der Fehler wurde ja schon genannt, aber so als allgemeine Anmerkung: Neuere Prozessoren (z.B. Intels Ivy Bridge Architektur) bieten auch schon direkt im Prozessor echte Hardwarezufallszahlen mit hohem Durchsatz und echtem Zufall an (RdRand). Für geringe Mengen an echten Zufallszahlen (z.B. als Seed für einen PRNG) bieten auch viele Betriebssysteme schon seit langen Zeiten Echtzufallszahlgeneratoren an, die ihre Entropie aus verschiedenen Quellen im System beziehen (Vorsicht bei virtuellen Maschinen!). Unter Linux z.B. /dev/random, unter Windows gibt's das auch, aber ich weiß nicht, wie es heißt.
-
Danke für's verschieben, hatte übersehen, dass ich mich im falschen Unterforum befand, weil ich über einen Link zu diesem Forum kam.
An CPU hät ich diese
http://www.amazon.de/Intel-Desktop-Prozessor-Q9550-Sockel-L2-Cache/dp/B0012WDMNC
und im Laptop einen Intel(R) Core(TM) i3 CPU M 390 @ 2.67GHzUnterstützen diese die Funktion bereits?
Ich hab nur die "C" entfernt und das extern gelassen, daraufhin kam folgende Fehlermeldung:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.C:\Users\Verrain>cd desktop
C:\Users\Verrain\Desktop>gcc t.c -o t
C:\Users\Verrain\AppData\Local\Temp\ccCdSYDJ.o:t.c:(.text+0x1e): undefined refer
ence to\_imp\_\_defineServer' C:\\Users\\Verrain\\AppData\\Local\\Temp\\ccCdSYDJ.o:t.c:(.text+0x34): undefined refer ence to
_imp__defineUser'
C:\Users\Verrain\AppData\Local\Temp\ccCdSYDJ.o:t.c:(.text+0x42): undefined refer
ence to\_imp\_\_getInt' c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: C:\\Users\\V errain\\AppData\\Local\\Temp\\ccCdSYDJ.o: bad reloc address 0x20 in section
.eh_fra
me'
c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link
failed: Invalid operation
collect2.exe: Fehler: ld gab 1 als Ende-Status zurückC:\Users\Verrain\Desktop>
-
Verrain schrieb:
Unterstützen diese die Funktion bereits?
Nein, die Technik ist ziemlich neu (etwas über ein Jahr alt).
Ich hab nur die "C" entfernt und das extern gelassen, daraufhin kam folgende Fehlermeldung:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.C:\Users\Verrain>cd desktop
C:\Users\Verrain\Desktop>gcc t.c -o t
C:\Users\Verrain\AppData\Local\Temp\ccCdSYDJ.o:t.c:(.text+0x1e): undefined refer
ence to\_imp\_\_defineServer' C:\\Users\\Verrain\\AppData\\Local\\Temp\\ccCdSYDJ.o:t.c:(.text+0x34): undefined refer ence to
_imp__defineUser'
C:\Users\Verrain\AppData\Local\Temp\ccCdSYDJ.o:t.c:(.text+0x42): undefined refer
ence to\_imp\_\_getInt' c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: C:\\Users\\V errain\\AppData\\Local\\Temp\\ccCdSYDJ.o: bad reloc address 0x20 in section
.eh_fra
me'
c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link
failed: Invalid operation
collect2.exe: Fehler: ld gab 1 als Ende-Status zurückC:\Users\Verrain\Desktop>
Klingt so, als hättest du die Bibliothek selbst nicht dazu gelinkt. Bloß den Header benutzen reicht nicht, irgendwo muss der Code für die Funktionen ja auch gefunden werden.
edit: Du zeigst ja sogar die Kommandozeile . Ja, die Bibliothek fehlt. Da muss noch irgendetwas a la
-lbibliotheksname
hin (und die Bibliothek muss auch gefunden werden). Falls du eine IDE benutzt, gibt es da bestimmt auch eine komfortable Funktion, um das alles automatisch einzurichten. Ansonsten musst du mal gucken, wie das bei mingw genau geht.
-
*hehe*- die Kommandozeile ist mit draufgerutscht
Bin auch gerad bei der Internetrechersche drauf gekommen, dass ich die Bibliothek scheinbar nicht richtig gelinkt habe.
Werde ich mich morgen nochmal mit befassen, wie das unter MingW richtig geht, bis jetzt hab ich einfach nur MingW\lib einen Ordner c erstellt und dort die header Datei, sowie die lib und DLL-Datei reingeschoben, allerdings ist nach dem Ändern, der .h-Datei doch auch die .lib und die .DLL Datei nicht mehr aktuell, oder?
Verwende Emacs, aber die Bibliotheken sind doch im Compiler hinterlegt und nicht in der Entwicklerumgebung, oder? (Sry, aber das einbinden von Bibliotheken ist für mich generell Neuland ^^)
-
Entweder du schreibst in der Befehlszeile manuell -lPfadzurDatei oder du fügst das bequem in einem Menü der IDE hinzu.
-
Verrain schrieb:
Verwende Emacs, aber die Bibliotheken sind doch im Compiler hinterlegt und nicht in der Entwicklerumgebung, oder? (Sry, aber das einbinden von Bibliotheken ist für mich generell Neuland ^^)
Die Bibliotheken selber sind weder im Compiler noch in der IDE, sondern irgendwo im System (aber hoffentlich an einem Ort, wo der Compiler oder die IDE gucken).
Falls du Schwierigkeiten haben solltest, gibt es zu mingw im Netz bestimmt viele Beschreibungen. Falls das nicht reichen sollte, guck/frag mal im hiesigen Compiler und IDE Unterforum nach.
-
Verrain schrieb:
allerdings ist nach dem Ändern, der .h-Datei doch auch die .lib und die .DLL Datei nicht mehr aktuell, oder?
Doch, die beschriebene Schnittstelle ist ja die gleiche, nur dass sie jetzt von C aus und nicht nur von C++ aus zugänglich ist.
-
schau mal hier. eine einfach und günstige lösung für physikalische Zufallserzeugung.
http://www.ibbergmann.org/1851938.htm
beste grüße
-
Also bis jetzt habe ich es noch immer nicht hinbekommen, dass die .lib Datei vom Compiler gefunden wird und auch im Compiler Untertopic konnte mir noch niemand weiterhelfen
-
Verrain schrieb:
Also bis jetzt habe ich es noch immer nicht hinbekommen, dass die .lib Datei vom Compiler gefunden wird und auch im Compiler Untertopic konnte mir noch niemand weiterhelfen
Am einfachsten wird es sein, wenn Du alle heruntergeladenenen und entzippten Dateien in einen einzigen Ordner packst, z.B. nach C:\Users\Verrain\qrdb. In diesem Ordner befindet sich dann Dein Quelltext und die Dateien:
qrbg-c.lib
qrbg-c.dll
qrbg-c.h
t.cDann manövrierst Du in der Eingabeaufforderung zu diesem Ordner (cd C:\Users\Verrain\qrdb) und setzt den Pfad zu GCC:
SET PATH=C:\MinGW\bin;%PATH%
Dann veränderst Du das Include in Deinem Quelltext:
#include "qrbg-c.h" // Pfad weg!
Nun rufst Du GCC auf:
gcc t.c -o t.exe -L.\ -lqrbg-c
Es müsste klappen ( nicht richtig getestet )
viele grüße
ralphEDIT: So, nun habe ich getestet. Du musst G++ als Compiler nehmen:
g++.exe -ot.exe t.c -L.\ -lqrbg-c
-
Vielen vielen Dank
Lustig, dass trotz g++ eine c Datei rauskomt
-
Naaa das war natürlich Müll, da hab ich einen gucken lassen
Natürlich ist es eine .exe Datei