Avatar billede Slettet bruger
08. maj 2006 - 10:54 Der er 28 kommentarer og
1 løsning

Kalde Function fra klasse, fejl opstår

Hvorfor kan jeg ikke gøre sådan her?.. nu har jeg roddet med det en halv dag tror jeg!

Fejl:
Error    3    error LNK2019: unresolved external symbol "public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl Functions::Test::ComputerName(void)" (?ComputerName@Test@Functions@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) referenced in function _main    TCPServer.obj   




[Funtions.h]
#ifndef Functions_H
#define Functions_H
#include "Functions.h"

using namespace std;

namespace Functions
{
    class Test
    {
        public:
        static std::string ComputerName();
       
    };
   
}
#endif

[Funtions.cpp]

#include "stdafx.h"
#include "Functions.h"

using namespace std;

std::string ComputerName()
{
    WSAData wsaData;
    WSAStartup(MAKEWORD(1, 1), &wsaData);
    char ac[80];
    if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR)
    {
        WSACleanup();
        return "Error";
    }

    WSACleanup();
    return ac;
}



[TCPServer.cpp]

#include "TCPServer.h"
#include "Functions.h"

using namespace std;
using namespace Functions;

int _tmain(int argc, char* argv[], TCHAR* envp[])
{
    std::string Name;

    Name = Functions::Test::ComputerName();

    while(_getch()!=27); //27 is ESC char
    return 0;
}
Avatar billede arne_v Ekspert
08. maj 2006 - 12:54 #1
prøv:

namespace Functions
{
  std::string Test::ComputerName()
  {
    ...
  }
}
Avatar billede Slettet bruger
08. maj 2006 - 23:02 #2
Det er så i min Functions.cpp fil right?


#include "stdafx.h"
#include "Functions.h"

using namespace std;

namespace Functions
{
    std::string Test::ComputerName()
    {
        WSAData wsaData;
        WSAStartup(MAKEWORD(1, 1), &wsaData);
        char ac[80];
        if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR)
        {
            WSACleanup();
            return "Error";
        }

        WSACleanup();
        return ac;
    }
}

Det compiler uden fejl, men hvordan henter jeg det ComputerName returner ud i min main fx, kan det her i C# men sgu ikke i c++ :/


int _tmain(int argc, char* argv[], TCHAR* envp[])
{
    Test bla = new Test();
    ComputerName = bla.ComputerName();

    while(_getch()!=27); //27 is ESC char
    return 0;
}

Error    1    error C2440: 'initializing' : cannot convert from 'Functions::Test *' to 'Functions::Test'    c:\Documents and Settings\Wb-FreeKill\Skrivebord\TCP Projekt\TCPServer\TCPServer.cpp    32   
Error    2    error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion)    c:\Documents and Settings\Wb-FreeKill\Skrivebord\TCP Projekt\TCPServer\TCPServer.cpp    33
Avatar billede arne_v Ekspert
08. maj 2006 - 23:05 #3
som i din oprindelige kode:

Name = Functions::Test::ComputerName();
Avatar billede arne_v Ekspert
08. maj 2006 - 23:06 #4
den er jo static
Avatar billede Slettet bruger
08. maj 2006 - 23:07 #5
ja det virker, men hvorfor kan jeg ikke sætte den for CString ComputerName som jeg har declareret globalt længere oppe?
Avatar billede Slettet bruger
08. maj 2006 - 23:08 #6
eller for den sags skyld std::string ComputerName
Avatar billede Slettet bruger
08. maj 2006 - 23:22 #7
laver jeg det hele om til std::strings, kører min server, men ligså snart den kommer til connect og kører:

char LoginString [1000];
sprintf (LoginString, "?join#%s#%s / %s#%s / %s",AssignedName,LANIP,WANIP,ComputerName,LoginName);

så crasher den.. er du gal jeg er træt af c++!!!
Avatar billede bertelbrander Novice
08. maj 2006 - 23:23 #8
Lad være med at bruge springf til C++!

Hvis du vil bruge sprintf så skal du bruge ComputerName.c_str() for at udskrive std::string's
Avatar billede arne_v Ekspert
08. maj 2006 - 23:24 #9
en CString og en std::string er ikke det samme
Avatar billede bertelbrander Novice
08. maj 2006 - 23:25 #10
Er det ikke lettere at skrive:
std::string LoginString = std::string("?join#") + LoginString + AssignedName + ...;
Avatar billede bertelbrander Novice
08. maj 2006 - 23:28 #11
Hvis du vil oprette et object for at kalde skal du bruge:
Test* bla = new Test();
ComputerName = bla->ComputerName();
delete bla;

Dette er C++ ikke C#
Avatar billede arne_v Ekspert
08. maj 2006 - 23:29 #12
sprintf %s betyder at argumenterne skal vaere char* eller char[]
Avatar billede Slettet bruger
09. maj 2006 - 08:57 #13
det her virker ikke, burde det ikke det?

std::string hej = "wee";
std::string LoginString = std::string("?newasname#") + hej;

Error    2    error C2784: 'std::_String_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_iterator<_Elem,_Traits,_Alloc>)' : could not deduce template argument for 'std::_String_iterator<_Elem,_Traits,_Alloc>' from 'std::string'    c:\Documents and Settings\laof\Desktop\TCP Projekt\TCPServer\TCPServer.cpp    140
Avatar billede arne_v Ekspert
09. maj 2006 - 13:12 #14
virker:

std::string LoginString;
LoginString = std::string("?newasname#") + hej;

?
Avatar billede Slettet bruger
09. maj 2006 - 21:11 #15
nope virker heller ikke:/

Nå lige for ikke at oprette en ny tråd, tror du kan hjælpe mig lidt:

Jeg bygger det her i MS VC++, men - jeg ville MEGET gerne have det her til at køre helt uden .net, for at jeg kan gøre det i MS VC++ så skal jeg includere nogle ting, og så fylder min server 230 kb!.. er det på nogen måde muligt at konvertere til Borland c++, det er vel 100% .net uafhængig?..
Avatar billede arne_v Ekspert
09. maj 2006 - 21:50 #16
du kan godt lave C++ programmer uden .NET med VC++

230 KB er ikke meget

men hvis du foretraeekker Borland saa haps den

eller mingw evt. med en af IDE'erne ovenpaa
Avatar billede bertelbrander Novice
09. maj 2006 - 21:52 #17
Det bør virke, kan du lave et komplet eksempel der ikke virker.

Hvis du ændrer _tmain til main og fortæller Visual Studio at den skal kompilere "native" og uden .net bør det kunne køre helt uden .net.

Men ellers bør det være trivielt at få det til at virke med BorlandC++ eller en anden C++ compiler.
Avatar billede Slettet bruger
09. maj 2006 - 21:52 #18
hvordan laver jeg det i VC uden .net?
Avatar billede Slettet bruger
09. maj 2006 - 21:58 #19
_tmain er ændret, hvor sætter jeg den til native og uden .net? :)

"Det bør virke, kan du lave et komplet eksempel der ikke virker."

Jeg sætter bare det ind som i forslår, og får nogle helt sindsyge lange højst ulæselige og helt uforståelige fejlmeddelser (typisk c++)
Avatar billede arne_v Ekspert
09. maj 2006 - 22:00 #20
#include <iostream>
#include <string>

int main()
{
  std::string hej = "wee";
  std::string LoginString = std::string("?newasname#") + hej;
  std::cout << LoginString << std::endl;
  return 0;
}

virker hos mig med VC++ 7.1 (2003) og mingw GCC 3.2.3
Avatar billede arne_v Ekspert
09. maj 2006 - 22:01 #21
VC++ oversaetter uden .NET medmindre du bedser om det (bruger /clr command line)
Avatar billede Slettet bruger
09. maj 2006 - 22:05 #22
jeg bruger ikke /clr, derfor?

ved du hvordan jeg sætter den til at kode native?
Avatar billede arne_v Ekspert
09. maj 2006 - 22:15 #23
med /clr = .NET
uden /clr = native

(/clr er navnet i 7/.1/2003 jeg kan ikke huske om de har aendret det i 8.0/2005)
Avatar billede Slettet bruger
09. maj 2006 - 22:19 #24
Selvom jeg ikke kører med /clr vil den ikke køre på en XP SP2 clean install uden at jeg sætter Runtime library til Multi-threaded (/MT) (fra 15 kb til 240 kb)
Avatar billede arne_v Ekspert
09. maj 2006 - 22:35 #25
er det et problem at saette det til /MT ?

og er 240 KB et problem ?

excel.exe er 10 MB !
Avatar billede Slettet bruger
09. maj 2006 - 22:40 #26
Den står allerede ved /MT for at kunne køre på min test PC.. det er Multi-threaded DLL (/MD)(15 kb) den ikke kan tage, hvorfor?.. hva er forskellen?

jeg syntes 240 kb for en console app er meget :)
Avatar billede arne_v Ekspert
10. maj 2006 - 03:31 #27
http://msdn2.microsoft.com/en-US/library/2kzt1wy3.aspx

citat:

/MD
   

Causes your application to use the multithread- and DLL-specific version of the run-time library. Defines _MT and _DLL and causes the compiler to place the library name MSVCRT.lib into the .obj file.

Applications compiled with this option are statically linked to MSVCRT.lib. This library provides a layer of code that allows the linker to resolve external references. The actual working code is contained in MSVCR80.DLL, which must be available at run time to applications linked with MSVCRT.lib.
Avatar billede arne_v Ekspert
19. juni 2006 - 00:18 #28
tid at få afsluttet her ?
Avatar billede Slettet bruger
19. juni 2006 - 23:42 #29
jep :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester