Erreur : "BLOB does not name a type "

Fermé
0cTeT Messages postés 39 Date d'inscription samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 - Modifié par 0cTeT le 30/09/2014 à 20:15
0cTeT Messages postés 39 Date d'inscription samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 - 11 oct. 2014 à 17:23
Bonjour,
je programme un petit programme utilisant les sockets (winsock2.h) mais lors de la compilation, les erreurs suivantes apparaissent :
"BLOB does not name a type"
"LPBLOB does not name a type"

Le compilateur ne reconnait pas la creation de ces structures ? Pourtant bien definies dans les deux fichiers il me semble...
Les erreurs se situent dans winsock2.h et objidl.h lors de la création d'une structure blob ou lpblob. J'utilise codeblock et MinGW... Merci de me répondre si vous connaissez la source du probleme ! (ce n'est pas la premiere fois que je code des sockets mais d'est bien la premiere fois que j'obtiens ces erreurs).

0cTeT

7 réponses

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
30 sept. 2014 à 22:01
Bonsoir
avant de rentrés dans les détail à tu essayer les en-tête suivante
#include <winsock2.h>
#include <windows.h>
0
0cTeT Messages postés 39 Date d'inscription samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 213
1 oct. 2014 à 16:05
#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL_image.h>
#include "fonctions.h"

/*Suivant l'architecture de la machine, deux manières d'enregistrer des données en mémoire*/
#if SDL_BYTEORDER == SDL_BIG_ENDIAN

#define MASQUE_ROUGE 0xff000000
#define MASQUE_VERT 0x00ff0000
#define MASQUE_BLEU 0x0000ff00
#define MASQUE_ALPHA 0x000000ff

#else

#define MASQUE_ROUGE 0x000000ff
#define MASQUE_VERT 0x0000ff00
#define MASQUE_BLEU 0x00ff0000
#define MASQUE_ALPHA 0xff000000

#endif
#define PORT 80

Entete de fichier .cpp
et ci dessous entete de main.cpp

#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL_image.h>
#include "fonctions.h"
#define PORT 80
0
0cTeT Messages postés 39 Date d'inscription samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 213
Modifié par 0cTeT le 1/10/2014 à 16:09
Apparemment , d'après des recherches, il semblerait que ce soit du a une erreur de mingw. Mais comment régler ce problème ?
Et j'ai déja essayer d'inclure windows.h (après winsock2.h car sinon source d'erreurs) mais sans aucun succès
Merci pour la réponse !
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
1 oct. 2014 à 16:48
Bonjour
Avant tout la ligne de
 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
ne sert Pa vraiment à grandes choses SDL gère très bien de ce côté-là
Deuxième point il est préférable d'avoir un seul fichier d'en-tête et l'inclure dans le main et les autre fichier au lieu de les démultiplier de plus les include sont ceux du langage C pour le langage C++ il faut
//C++
#include <cstdlib>
#include <cstdio>
#include <cstring>

//Windows
#include <windows.h>
#include <winsock2.h>

//SDL (C)
#include <SDL/SDL.h>
#include <SDL_image.h>

//Perso
#include "fonctions.h"

Je testerais tes sources sous environnement Windows dès que possible et aussi pour la lisibilité de ton code utilise les balises mises à ta disposition
à bientôt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
0cTeT Messages postés 39 Date d'inscription samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 213
1 oct. 2014 à 22:57
Merci encore ! Je sais que ces include sont ceux du C , mais tout simplement parceque je prefere programmer en C ; mais un projet SDL est en C++. Les librairies du C marchent quand meme. D'habitude je rassemble mes entetes dans un seul fichier.h mais j'ai essayer de les mettre dans tous les fichiers pour régler le problème, sans succès , évidemment.

Et voici les sources : le main


#include <ws2tcpip.h>
#include <cstdlib>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL_image.h>
#include "fonctions.h"
#include <nspapi.h>
#define PORT 80


int initWSA() // On initialise
{
WSADATA wsa;
int error = WSAStartup(MAKEWORD(2,0),&wsa);
if (error <0)
{
return -1;
}
else{
return 1;
}
}



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

initWSA();


SOCKET sock =socket(AF_INET,SOCK_STREAM,0); // BEGIN
struct sockaddr_in sin = {0}; //
struct hostent *hostname = gethostbyname("www.newbiecontest.org");
sin.sin_addr = *(IN_ADDR*) hostname->h_addr; // On initialise les paramètres pour le socket
sin.sin_port = htons(80); //
sin.sin_family = AF_INET; // END

FILE *output;
output = fopen("output.txt","w");


char get_prog[]="GET /epreuves/prog/prog11.php HTTP/1.1\r\nHost: www.newbiecontest.org\r\nCookie: SMFCookie89=a%3A4%3A%7Bi%3A0%3Bs%3A5%3A%2260433%22%3Bi%3A1%3Bs%3A40%3A%22d2f7cfb9a7f02d3b3ffd559ab91122634d22f98d%22%3Bi%3A2%3Bi%3A1598521102%3Bi%3A3%3Bi%3A0%3B%7D; PHPSESSID=c0f0bcc73ab8597e24ad1110bf908ab9; admin=0\r\n\r\n";
char epreuve[9999]="";

SDL_Surface *img = NULL;
img = SDL_CreateRGBSurface(0, 330, 55, 32,rmask, gmask, bmask, amask);
SDL_Rect positionFond;

positionFond.x = 0;
positionFond.y = 0;

connect(sock,(SOCKADDR *)&sin, sizeof(SOCKADDR));
send(sock,get_prog,strlen(get_prog),0);
recv(sock,epreuve,sizeof epreuve -1,0);

insec(epreuve); // créer les fichiers img1.png , img2.png et img3.png
organize(img); // remplit la surface img, en réorgarnisant les pixels de l'image de l'épreuve

WSACleanup();
return 0;
}


Ensuite fonctions.cpp

#include <cstdlib>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL_image.h>
#include <iostream>
#include "fonctions.h"

/*Suivant l'architecture de la machine, deux manières d'enregistrer des données en mémoire*/
#if SDL_BYTEORDER == SDL_BIG_ENDIAN

#define MASQUE_ROUGE 0xff000000
#define MASQUE_VERT 0x00ff0000
#define MASQUE_BLEU 0x0000ff00
#define MASQUE_ALPHA 0x000000ff

#else

#define MASQUE_ROUGE 0x000000ff
#define MASQUE_VERT 0x0000ff00
#define MASQUE_BLEU 0x00ff0000
#define MASQUE_ALPHA 0xff000000

#endif
#define PORT 80




Uint32 GetPix(SDL_Surface *img,int x,int y)
{
int nbOctetsParPixel = img->format->BytesPerPixel;

Uint8 *p = (Uint8 *)img->pixels + y * img->pitch + x * nbOctetsParPixel;

/*Gestion différente suivant le nombre d'octets par pixel de l'image*/
switch(nbOctetsParPixel)
{
case 1:
return *p;

case 2:
return *(Uint16 *)p;

case 3:
/*Suivant l'architecture de la machine*/
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;

case 4:
return *(Uint32 *)p;

/*Ne devrait pas arriver, mais évite les erreurs*/
default:
return 0;
}
}

void SetPix(SDL_Surface *img,int x,int y,Uint32 pixel)
{

int nbOctetsParPixel = img->format->BytesPerPixel;
/*Ici p est l'adresse du pixel que l'on veut modifier*/
/*surface->pixels contient l'adresse du premier pixel de l'image*/
Uint8 *p = (Uint8 *)img->pixels + y * img->pitch + x * nbOctetsParPixel;

/*Gestion différente suivant le nombre d'octets par pixel de l'image*/
switch(nbOctetsParPixel)
{
case 1:
*p = pixel;
break;

case 2:
*(Uint16 *)p = pixel;
break;

case 3:
/*Suivant l'architecture de la machine*/
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
{
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
}
else
{
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;

case 4:
*(Uint32 *)p = pixel;
break;
}
}


void insec(char *epreuve_ptr) // Cette fonction sépare les 3 images et les enregistre dans des fichiers png
{
int i = 236; /* variable pour recupérer les caractères d'epreuve_ptr. i=236 pour sauter les entetes http */
int c=1; /* variable permettant de savaoir quel image (tableau de char) récupérer. Si c=1 -> img1_char, c=2 -> img2, c=3 -> img3 */
int temp = 0; /* variable permettant de serepérer dans le tableau de caractères epreuve_ptr */

FILE *img1_file;
FILE *img2_file;
FILE *img3_file;

img1_file = fopen("img1.png","wb");
img2_file = fopen("img2.png","wb");
img3_file = fopen("img3.png","wb");

char img1_char[9999]="";
char img2_char[9999]="";
char img3_char[9999]="";


for(;i<6000;i++)
{
if(epreuve_ptr[i]=='I'&&epreuve_ptr[i+1]=='E'&&epreuve_ptr[i+2]=='N'&&c==1)
{

for(int p=0;p<i+8-236;p++) // tant que p<i+8 car a partir du "I" de "IEND" il y a 8 caractères avant la fin du png. -236 car on doit ignorer l'entete http
{

img1_char[p]=epreuve_ptr[p+236]; // On extrait la premiere image
}
c=2;

for(;epreuve_ptr[i]!='0/00';i++){} // epreuve_ptr[i] représente maintenant le premier cractère de l'image suivante (ici l'img2)
temp=i; // on copie dans temp i pour pouvoir reutiliser i dans la boucle et garder en mémoire le début du fichier png.
}
if(epreuve_ptr[i]=='I'&&epreuve_ptr[i+1]=='E'&&epreuve_ptr[i+2]=='N'&&c==2)
{

for(int p=0;p<i-temp+8;p++)
{

img2_char[p]=epreuve_ptr[temp+p]; // On extrait la seconde
}
c=3;

for(;epreuve_ptr[i]!='0/00';i++){}
temp=i;
}
if(epreuve_ptr[i]=='I'&&epreuve_ptr[i+1]=='E'&&epreuve_ptr[i+2]=='N'&&c==3)
{

for(int p=0;p<i-temp+8;p++)
{

img3_char[p]=epreuve_ptr[temp+p]; // On extrait la troisieme
}
}
}
for(int i=0;i<6000;i++)
{

fprintf(img1_file,"%c",img1_char[i]); // maintenant on enregistre
}


for(int i=0;i<2000;i++)
{

fprintf(img2_file,"%c",img2_char[i]);
}
for(int i=0;i<2000;i++)
{

fprintf(img3_file,"%c",img3_char[i]);
}

fclose(img1_file); // C'est finit on ferme les flux
fclose(img2_file);
fclose(img3_file);

}

void organize(SDL_Surface *img) // fonction reorganisant les pixels de l'image
{
SDL_Surface *img1 = NULL, *img2 = NULL, *img3 = NULL, *temp = NULL;
Uint32 pixel;
Uint8 r,v,b,a;
Uint8 aj_r,aj_v,aj_b;
Uint8 temp_r,temp_v,temp_b;

temp = SDL_CreateRGBSurface(0, 330, 55, 32,MASQUE_ROUGE, MASQUE_VERT, MASQUE_BLEU, MASQUE_ALPHA); // On creer la surface RGB de la surface provisoire

int img1_x=0; // variable permettant de naviguer dans les abscisses (330 pixels max)
int img1_y=0; // variable permettant de naviguer dans les ordonnées (55 pixels max)
int img2_y=0; // (55 pix max)
int img3_x=0; // (330 pix max)
int temp_x=0;
int temp_y=0;


img1 = IMG_Load("img1.png");
img2 = IMG_Load("img2.png");
img3 = IMG_Load("img3.png");

for(;img3_x<330;img3_x++)
{

pixel = GetPix(img3,img3_x,0);
SDL_GetRGBA(pixel, img3->format, &aj_r, &aj_v, &aj_b, &a); // On récupère les valeurs d'ajout


for(;img1_y<55;img1_y++)
{

pixel = GetPix(img1,img3_x,img1_y);
SDL_GetRGBA(pixel, img1->format, &r,&v,&b,&a); // On récupère les valeurs rgba de l'img1


/* On commence par replacer la valeur de la composante rouge dans temp a partir de img1, on procède ainsi :
-On récupère le pixel correspondant dans temp.png.
-On insère la valeur de r dans temp_r
-On reinjecte le pixel
..............................................................
............................................................*/

pixel = GetPix(temp,img3_x,modulo(img1_y-aj_r,54));
SDL_GetRGBA(pixel, temp->format, &temp_r,&temp_v,&temp_b,&a);
temp_r=r;
pixel=SDL_MapRGBA(temp->format, temp_r, temp_v, temp_b, a);
SetPix(temp,img3_x,modulo(img1_y-aj_r,54),pixel);

/* On procède de meme avec la composante verte */

pixel = GetPix(temp,img3_x,modulo(img1_y-aj_v,54));
SDL_GetRGBA(pixel, temp->format, &temp_r,&temp_v,&temp_b,&a);
temp_v=v;
pixel=SDL_MapRGBA(temp->format, temp_r, temp_v, temp_b, a);
SetPix(temp,img3_x,modulo(img1_y-aj_v,54),pixel);

/* Et encore de meme avec la composante bleue */

pixel = GetPix(temp,img3_x,modulo(img1_y-aj_b,54));
SDL_GetRGBA(pixel, temp->format, &temp_r,&temp_v,&temp_b,&a);
temp_b=b;
pixel=SDL_MapRGBA(temp->format, temp_r, temp_v, temp_b, a);
SetPix(temp,img3_x,modulo(img1_y-aj_b,54),pixel);

}
}

// maintenant on fait de meme en prenant l'img2 , donc un peu different

for(;img2_y<55;img2_y++)
{


pixel = GetPix(img2,0,img2_y);
SDL_GetRGBA(pixel, img3->format, &aj_r, &aj_v, &aj_b, &a); // On récupère les valeurs d'ajout

for(;temp_x<330;temp_x++)
{

pixel = GetPix(temp,temp_x,img2_y);
SDL_GetRGBA(pixel, temp->format, &r,&v,&b,&a); // On récupère les valeurs rgba de l'img1

/* On commence par replacer la valeur de la composante rouge dans temp a partir de img1, on procède ainsi :
-On récupère le pixel correspondant dans temp.png.
-On insère la valeur de r dans temp_r
-On reinjecte le pixel
..............................................................
............................................................*/

pixel = GetPix(img,modulo(temp_x-aj_r,329),img2_y);
SDL_GetRGBA(pixel, img->format, &temp_r,&temp_v,&temp_b,&a);
temp_r=r;
pixel=SDL_MapRGBA(img->format, temp_r, temp_v, temp_b, a);
SetPix(img,modulo(temp_x-aj_r,329),img2_y,pixel);

/* On procède de meme avec la composante verte */

pixel = GetPix(img,modulo(temp_x-aj_v,329),img2_y);
SDL_GetRGBA(pixel, img->format, &temp_r,&temp_v,&temp_b,&a);
temp_v=v;
pixel=SDL_MapRGBA(img->format, temp_r, temp_v, temp_b, a);
SetPix(img,modulo(temp_x-aj_v,329),img2_y,pixel);

/* Et encore de meme avec la composante bleue */

pixel = GetPix(img,modulo(temp_x-aj_b,329),img2_y);
SDL_GetRGBA(pixel, temp->format, &temp_r,&temp_v,&temp_b,&a);
temp_b=b;
pixel=SDL_MapRGBA(temp->format, temp_r, temp_v, temp_b, a);
SetPix(img,modulo(temp_x-aj_b,329),img2_y,pixel);

}

}

}
int modulo(int val,int modul) // Fonction permettant de faire tenir la valeur dans l'intervalle des pixels
{
while(val<0)
{
val+=modul;
}
while(val>modul)
{
val-=modul;
}
return val;
}
0
0cTeT Messages postés 39 Date d'inscription samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 213
1 oct. 2014 à 23:01
désolé c'es un peu long... Si possible essaie de compiler ca, le code a peut etre des erreurs , mais elles ne m'interressent pas pour l'instant, je ne crois pas que les erreurs citées plus haut soient de ma faute ...
Bonne soiree
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 6/10/2014 à 10:42
Bonjour
J'ai essayé de repartir sur la base de tes sources pour faire ce bout de code et ceci dit chez moi ça compile c'est déjà ça . Quant à tes erreurs cela vient du fait que tu utilises
 #include <winsock2.h> 
sans pour autant le lier à ton projet de développement ( c'est à dire
#pragma comment(lib, "ws2_32.lib")
) car, c'est de cette manière qu'il faut utiliser les sockets de Windows. Sur certaines choses tu te compliques la vie alors qu'il y a plus simple à faire pour le reste je verrais ça plus tard à bientôt
//Bibliothèque C++ & Windows
#include <iostream>
#include <winsock2.h>

//Linker
#pragma comment(lib, "ws2_32.lib")

//Define
#define PORT 80
#define BUFF 1024
#define WEB "www.newbiecontest.org"

/***
* Programme Principale
***/
int main( int argc, char **argv ){

 //Variables
 SOCKET Sck;
 SOCKADDR_IN Srv;
 WSADATA WSAData;
    
 //Initialisation
 WSAStartup( MAKEWORD( 2, 0 ), &WSAData );

 //Configuration de la socket
 Sck = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
 if( Sck == INVALID_SOCKET ){
  std::cerr<< "Erreur Socket" <<std::endl;
  getchar();
  exit( 1 );
 }

 //Configuration serveur
 memset( &Srv, 0, sizeof(SOCKADDR_IN) );
 (&Srv)->sin_family = AF_INET;
 (&Srv)->sin_addr.s_addr = inet_addr( WEB );
 (&Srv)->sin_port = htons( PORT );

 //Connexion au serveur
 auto ret = connect( Sck, (SOCKADDR*)&Srv, sizeof(Srv) );
 if( ret == SOCKET_ERROR ){
  std::cerr << "Erreur de connexion au serveur\t: " << WEB << std::endl;
  getchar();
  closesocket( Sck );
  exit( 1 );
 }

 //Aquisition & Envoie des donnée
 char *pData = (char*)calloc( BUFF, sizeof(char) );
 pData ="GET /epreuves/prog/prog11.php HTTP/1.1\r\nHost: www.newbiecontest.org\r\nCookie: SMFCookie89=a%3A4%3A%7Bi%3A0%3Bs%3A5%3A%2260433%22%3Bi%3A1%3Bs%3A40%3A%22d2f7cfb9a7f02d3b3ffd559ab91122634d22f98d%22%3Bi%3A2%3Bi%3A1598521102%3Bi%3A3%3Bi%3A0%3B%7D; PHPSESSID=c0f0bcc73ab8597e24ad1110bf908ab9; admin=0\r\n\r\n";
 
 //Envoie de la requête && Reset Data
 send( Sck, pData, sizeof( pData ), 0 );

 memset( pData, 0, sizeof( pData ) );
 //Aquisition de la response
 recv( Sck, pData, sizeof(pData), 0 );

 //Affichage du résultat
 if( pData != NULL ){
  std::cout << pData << std::endl;
  getchar();
 }
 std::cout << "Aucune information fournis par le serveur" << WEB << std::endl;
    
 //Close de la Socket
 free( pData );
 closesocket( Sck );
 WSACleanup();

    return ( 0 );
}


Toute connaissance est une réponse à une question.
0
0cTeT Messages postés 39 Date d'inscription samedi 15 juin 2013 Statut Membre Dernière intervention 30 mars 2020 213
11 oct. 2014 à 17:23
Merci encore pour ta réponse ! Malheureusement cette ligne :#pragma comment(lib, "ws2_32.lib")
ne change rien , de toute facon je linkais deja a partir de compiler->settings. Pöur le programme , il n'est pas du tout au point , il y a des boucles a rajouter des crochets a enlever ... Je n'ai plus le probleme , j'ai juste recreer un projet et fais un copier-coller de toutes les sources, et ca marche ... ca marche mais aucune explication valable, merci quand meme !
0