Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Jeg tenkte å prøve å ta opp c++ winsock igjen, men møtte på problemer med en gang.

Jeg leser fra denne http://old.bsrf.org.uk/tutorials/part1.html akkurat nå.

Problemet er at jeg ikke greier å kompilere. Jeg laget et nytt prosjekt, og på linker options skrev jeg inn wsock32.lib og mpr.lib. Så prøvde jeg å kompilere dette.

#include 
#include 
#include 

#define PORT 3550   /* Port that will be opened */ 
#define BACKLOG 1   /* Number of allowed connections */


struct sockaddr_in server; /* server's address information */
struct sockaddr_in client; /* client's address information */

int sin_size;


WSADATA  wsdata;
SOCKET   fd, fd2;
DWORD    wsock;


LRESULT CALLBACK recall (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

{
     static TCHAR szAppName[] = TEXT("Server");

     HWND      	hwnd;
     MSG      	msg;
     WNDCLASS      wndclass;

     wndclass.style          = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc    = recall;
     wndclass.cbClsExtra     = 0;
     wndclass.cbWndExtra     = 0;
     wndclass.hInstance      = hInstance;
     wndclass.hIcon      	= LoadIcon (NULL, IDI_APPLICATION);
     wndclass.hCursor      	= LoadCursor (NULL, IDC_ARROW);
     wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH);
     wndclass.lpszMenuName   = NULL;
     wndclass.lpszClassName  = "Server";
     
     RegisterClass (&wndclass);

     hwnd = CreateWindow (szAppName,      	// Windows Class Name
              "Server",             // Windows Caption
              WS_OVERLAPPEDWINDOW,   // Windows Style
              CW_USEDEFAULT,      	// initial x position
              CW_USEDEFAULT,      	// initial y position
              200,              // initial x size
              200,              // initial y size
              0,              // parent window handle
              0,              // parent menu handle
              hInstance,             // program instance handle
              0);              // creation parameters


     ShowWindow(hwnd, iCmdShow);

     while (GetMessage (&msg, NULL, 0, 0))
     {
     	DispatchMessage  (&msg);
     }
     return 1;
}


LRESULT CALLBACK recall (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_LBUTTONDOWN)
{   
  WSAStartup(0x0101,&wsdata);  

  if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )  /* calls socket() */
  {
        MessageBox(0,"Socket Error","Error",0);
        return -1;
  }

             server.sin_family      	= AF_INET;         
             server.sin_port      	= htons(PORT);          /* Remember htons() from "Conversions" section? =) */
             server.sin_addr.s_addr      = INADDR_ANY;       /* INADDR_ANY puts your IP address automatically */

  if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr)) == -1) /* calls bind() */
  { 
        MessageBox(0,"Bind Error","Error",0);
           return -1;
  }    


  if(listen(fd,BACKLOG) == -1) /* calls listen() */
  { 
        MessageBox(0,"Listen Error","Error",0);
           return -1;
  }


     while(1)
     {
     sin_size = sizeof(struct sockaddr_in);
     if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size)) == -1) /* calls accept() */
     
     {

        MessageBox(0,"Accept Error","Error",0);
        return -1;

     }
 
        MessageBox(0,"Client connected to server.","Connection",0);


        send(fd2,"Welcome to my server.\n",22,0); /* send to the client welcome message */

  WSACleanup();

  return -1;

}
}

     if (message == WM_DESTROY)
     	PostQuitMessage(0);

     return DefWindowProc(hwnd, message, wParam, lParam);
}

Her

#include

#include

#include

 

antok jeg at det skulle være

#include <winsock.h>

#include <windows.h>

#include <iostream>

 

Men er ikke sikker. Feilen jeg får er C:\Documents and Settings\Compaq_Eier\Skrivebord\c++\winsock\Makefile.win [build Error] ["Prosjekt] Error 1

Lenke til kommentar
  • 1 måned senere...
Videoannonse
Annonse

Problemet med den første tror jeg er at den ikke får en null-terminering, dvs at printf vil skrive ut garbage.

2 måter å løse det på:

char tekst[15];
strncpy(tekst, "heisan", 6);
tekst[6] = '\0';
printf("%s\n", tekst);

eller

char tekst[15];
memset(tekst, '\0', 15);
strncpy(tekst, "heisan", 6);
printf("%s\n", tekst;

 

Viktigste er ihvertfall at du får inn en nullterminering så printf ikke skriver ut masse random tull.

 

Oppgave 2:

 

strcmp har 3 returverdier.

Dersom den returnerer 0, så er strengene like, altså må du ha:

if(!strcmp(string1,string2))
printf("The strings are equal\n");

Endret av Nazgul
Lenke til kommentar
In the case where the length of src is less than  that  of

      n, the remainder of dest will be padded with nulls.

 

lettere bare å

strncpy(tekst, ”heisan”, 7);

5024930[/snapback]

Ja, sorry, leste litt feil ibeskrivelsen. :blush:

Synes det var litt merkelig at den ikke kunne legge til nullterminering... :hmm:

Lenke til kommentar

Hei hei!

 

Dette har sikkert vært spurt om før, men jeg finner ikke svar på det jeg lurer på likevel...... Jeg bruker dev c++ og har problemer med at når jeg velger kjør og kompiler, så lukker terminalvinduet seg etter koden er ferdig å kjøre.... Noen som vet hva jeg kan gjøre for å unngå det?

 

mvh swj

Lenke til kommentar

Det er noe feil i min do-while sak trur jeg, muligens i if setnigna mi også.. Den vill ikke slutte når jeg trykker n.

 

//---------------------------------------------------------------------------

#pragma hdrstop
#include <stdio.h>
//---------------------------------------------------------------------------

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

int elevAlder[10];
int i, j, m, sumAlder = 0;
float gjAlder;
char a, l;



       for ( i = 0; i <= 9; i++ ) {
               printf( "Alder elev nr. %d :", i + 1 );
               scanf( "%d", &elevAlder[i] );
               sumAlder = sumAlder + elevAlder[i];
       }

       gjAlder = sumAlder / i;
       printf( "Snitt alder er %.2f", gjAlder );


       printf( "\n\nVil du redigere på en alder? (J/N)" );
       scanf( " %c", &a );

       if ( ( a = 'j' ) || ( a = 'J' ) ) {
               do {
                       printf( "\n\nTast elev nr 1-10 for og redigere" );
                       scanf( "%d", &m );

                       printf ( "Du valgte elev nr. %d\n", m );
                       printf ( "Tast inn ny alder" );
                       scanf( "%d", &elevAlder[m-1] );

                       printf( "Ny alder på elev nr. %d er %d\n", m, elevAlder[m-1] );
                               sumAlder = 0;
                               for ( i = 0; i <= 9; i++ ) {

                                       sumAlder = sumAlder + elevAlder[i];
                               }
                               gjAlder = 0;
                               gjAlder = (float)sumAlder / i;
                               printf( "Ny snitt alder er %.2f\n\n", gjAlder );

                       printf( "Vil du redigere mer? (J/N)" );
                       scanf( " %c", &l );
               } while ( ( l= 'j' ) || ( l = 'J' ) );
       }



       getchar();getchar();

       return 0;
}
//---------------------------------------------------------------------------

 

Sikkert en eller annen tåpelig feil. Men jeg ser den ikke.

EDIT: koden så litt rar ut noen steder grunnet den var litt brei.

Endret av Lord-KGA
Lenke til kommentar
Det er noe feil i min do-while sak trur jeg, muligens i if setnigna mi også.. Den vill ikke slutte når jeg trykker n.

...

Sikkert en eller annen tåpelig feil. Men jeg ser den ikke.

EDIT: koden så litt rar ut noen steder grunnet den var litt brei.

5048005[/snapback]

Du bruker l = 'j' .. du tilordner en variabel, ikke sammenligner. Bruk ==. Også .. hvis du i stedet skriver konstanter på venstre side av tester, 'j' == l, vil du kunne oppdager slike feil.

 

Gjelder alle testene dine.

Endret av hishadow
Lenke til kommentar
  • 3 uker senere...

I tilfelle det er flere dyslektikere der ute som sliter med å inkludere » #<iostream>

Sjekk at det står iostream og ikke isostream.

 

Har prøv å få til automatisk (LIBRARY_PATH, etc av standart biblioteket) inkluderingen i g++ i hele helgen hvor jeg tilslutt ga opp og benyttet: locate iostream(!) og fant følgende plasering:

#include </usr/include/c++/4.0.3/backward/iostream.h>

Selv ikke da oppdaget jeg a det skal være iostream og ikke isostream,

ikke engang da google hjalp meg med skrivefeilen ringte det en bjelle.

 

It is hard to be an dysleximan.... (fritt inspirert av en The julekalender)

 

Jaja shit happens.

 

Edit

Nødvendigheten av denne posten kan diksuteres, men det er godt å få utløp for kodefrustrasjon. Ikke at det er en gyldig unskyldning.....

Endret av Fjoggs
Lenke til kommentar
  • 2 uker senere...

Hvordan utfører jeg en NOT på en integer i c++ ? og hvordan bestemmer jeg hvor stor integeren må være, så jeg får med riktig antall tegn i resultatet?

 

F.eks. dersom jeg har 0x00004cf6 så skal resultatet bli 0xffffb409 ..

 

Jeg har også her prøvd diverse, samt at jeg har søkt en del rundt, men jeg finner ikke ut av disse to (nokså elementære) problemstillingene.

Lenke til kommentar

Jeg spør mange dumme spørsmål nå, men...

Finnes det noen funksjon som standard i c++ som er ekvivalent med assemblys ROL eax,99 ? (ROL har OPCODE c1c3) Hvordan kan jeg eventuelt implementere denne funksjonen i assemblyform i et program, og da utføre den på integeren d? (url til god, selvforklarende guide for inline asm i c++? finner ingen gode selv, sliter med søkestrengene i google)

 

Eller kanskje noen vet om en enkel måte å lage en c++-funksjon som gjør samme jobben som ROL ?

Da en:

int Rol(int* target, int nr){ /*...*/ } ?

 

 

edit: ser ut som om det fungerer slik: (x<<5)|(x>>(32-5)) for en ROL 5, og for 99 da så bare tar jeg 99%32 og stapper det inn i stedet for 5 *wee*

Endret av Zethyr
Lenke til kommentar

 //---------------------------------------------------------------------------

#include <stdio.h>
#define STUDENTS 3
#define EXAMS 4
//---------------------------------------------------------------------------
int minimum( const int grades[][ EXAMS ], int pupiles, int tests );
int max( const int grades[][ EXAMS ], int pupiles, int tests );
double average( const int grades[][ EXAMS ], int tests, int studentnr );
void pirint( const int array[][ EXAMS ], int pupiles, int tests );

int main()
{        const int studentgrades[ STUDENTS ][ EXAMS ] = { { 40, 30, 40, 50 },
                                                   { 20, 30, 20, 50 },
                                                   { 60, 50, 10, 20 } };
       int max, min;
       int i;


       print( studentgrades, STUDENTS, EXAMS );

       printf( "\n\minimum grade: %d\n", minimum( studentgrades, STUDENTS, EXAMS ) );
       printf( "maximum grade: %d\n", max( studentgrades, STUDENTS, EXAMS ) );

       for ( i = 1; i <= STUDENTS; i++ ) {
               printf( "The average grade for student %d is: %.1f", i, average( studentgrades, EXAMS, i ) );
       } /* emd for */



       getchar();getchar();
       return 0;
}
//---------------------------------------------------------------------

               /* functions */

       /* function to find lowest grade */
       int minimum( const int grades[][ EXAMS ], int pupiles, int tests ){

               int i, j;               /* counter */
               int lowGrade = 60;     /* max grade */

               for ( i = 0; i < pupiles; i++ ){
                       for ( j = 0; j < tests; j++ ) {
                               if ( grades[ i ][ j ] < lowGrade ) {
                                       lowGrade = grades[ i ][ j ];
                               } /* end if */
                       } /* end for */
               } /* end for */

               return lowGrade;        /* returns value of lowest grade */
       }  /* end function */


       /* function to find max grade */
       int max( const int grades[][ EXAMS ], int pupiles, int tests ){

               int i, j;               /* counter */
               int higGrade = 0;     /* max grade */

               for ( i = 0; i < pupiles; i++ ){
                       for ( j = 0; j < tests; j++ ) {
                               if ( grades[ i ][ j ] > higGrade ) {
                                       higGrade = grades[ i ][ j ];
                               } /* end if */
                       } /* end for */
               } /* end for */

               return higGrade;        /* returns value of lowest grade */
       }  /* end function */


       /* function to find average value */
       double average( const int grades[][ EXAMS ], int tests, int studentnr ) {

               int i;
               float total = 0;
               float gj;

               for ( i= 0; i < tests; i++ ) {
                       total += grades[ studentnr ][ i ];          /* total of all grades to student */
               } /* end for */

               gj = total / tests;

               return gj;
       } /* end function */


       /* function print array */
       void pirint( const int array[][ EXAMS ], int pupiles, int tests ) {

               int i, j;

               printf( "The array is:" );
               for ( i = 0; i < pupiles; i++ ) {
                       printf( "Studentgrades[%d] = ", pupiles + 1 );
                       for ( j = 0; j < tests; j++ ) {
                               printf( "%d  ", pupiles, array[ i ][ j ] );
                       } /* end for */
                       printf( "\n" );
               } /* end for */
       } /* end function */

 

hva har jeg gjort feil.

Får feilmelding cal of non function på der jeg kaller på max funktionen.

Lenke til kommentar
  • 1 måned senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...