data naar seriele poort sturen.

Pagina: 1
Acties:
  • 393 views sinds 30-01-2008

  • michielske
  • Registratie: Maart 2006
  • Laatst online: 30-11 09:05
Ik ben momenteel bezig aan een klein projectje hiervoor heb ik een paar topics geopend maar momenteel zit ik vast.

http://gathering.tweakers.net/forum/list_messages/1203725/
http://gathering.tweakers.net/forum/list_messages/1204125

omdat ik vastzit met de batch file dacht ik van laat ik maar eens c,c++ proberen.

Ik heb denk ik een goed voorbeeld gevonden op deze site bij het gedeelte data verzenden:
http://www.codeproject.com/system/serial.asp

ik heb deze code allereerst probere te compilen met borland c++ versie 5

ik krijg allerlei errors van include file die gemist werden, na deze allemaal te hebben gedownload terug proberen te compilen en je raad het al, nog errors.

Nu vroeg ik mij af gebruik ik wel de juiste compile software en zo nee welk raden jullie mij aan.
Is het ook mogelijk om type voor de te verzenden data te wijzigen vb in plaats van een string te verzenden een hexadecimale code te verzenden?

En zeker nog zit met deze code op het juiste spoor? Ik zou niet willen dat ik hier veel tijd insteek als het toch nooit zou kunnen werken?

  • michielske
  • Registratie: Maart 2006
  • Laatst online: 30-11 09:05
niemand een idee?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Je kunt elke compiler die windows applicaties kan bouwen gebruiken, als je maar de standaard windows headers en libs erbij hebt, dat kan dus ook met Borland 5.5 commandline compiler, al is het niet de meest recente.

Het aanspreken van de COM poort gaat al via de plain Win32 API dus je hoeft verder geen aparte headers of libs te hebben.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • OverSoft
  • Registratie: December 2000
  • Laatst online: 27-11 22:25
Mocht je toch problemen krijgen met het aanspreken van je poorten (serieel of parallel) kijk dan eens naar portIO. Is een gratis COM componentje waar je dus je poorten mee aan kunt spreken :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

portIO is alleen bedoelt voor het direct kunnen aansturen van de poorten. Totaal overbodig voor normale seriele communicatie.

Overigens zijn er een hoop tutorials te vinden voor seriele communicatie. Welke taal/omgeving je ervoor gebruikt maakt niet zo heel veel uit.

[ Voor 36% gewijzigd door Creepy op 12-03-2007 22:02 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • michielske
  • Registratie: Maart 2006
  • Laatst online: 30-11 09:05
Ik heb borland commandline compiler gedownload en geinstaleerd maar ik kan geen enkele source compilen zelfs geen voorbeeldjes die bij de compiler bijzitten.

Ik volg de instructie uit die hier gegevens staat voor het de source simple.cpp

http://dn.codegear.com/article/20997

dit is de output van de compile

C:\Borland\BCC55\Bin>bcc32 -If:\Borland\bcc55\include -Lf:\Borland\bcc55\Lib sim
ple.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
simple.cpp:
Error E2209 simple.cpp 2: Unable to open include file 'funcs.h'
Error E2268 simple.cpp 6: Call to undefined function 'PrintSomeOutput' in functi
on main()
*** 2 errors in Compile ***

C:\Borland\BCC55\Bin>

heb al naar de erros gezocht op google en daar vind ik dat je 2 config files moet aanmaken om naar de lib's te verwijzen, normaal moet dit niet omdat ik de lib's direct meegeef bij de compile functie. Ik heb toch maar de 2 config files aangemaakt en dan krijg ik volgende output:

C:\Borland\BCC55\Bin>bcc32 simple
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
simple.cpp:
Error E2209 simple.cpp 2: Unable to open include file 'funcs.h'
Error E2268 simple.cpp 6: Call to undefined function 'PrintSomeOutput' in functi
on main()
*** 2 errors in Compile ***

blijkbaar is er toch iets mis met de link naar de header files.
want de header files zijn wel aanwezig.

Wat kan het probleem zijn?
Kan je ook missende headerfiles downloaden? voor mijn projectje heb ik een code gevonden (zie hierboven)n die ik graag wil compilen maar daar is een header file bij: serial.h die niet aanwezig is bij de compiler. is dit normaal of gebruik ik een foute broncode? Of is de compiler mss toch te oud?

  • bobo1on1
  • Registratie: Juli 2001
  • Laatst online: 19-10 00:17
Hij kan het bestand funcs.h niet vinden, in de source kun je zien dat de filename tussen aanhalingstekens staat, dat betekent dat het header bestand in dezelfde directory moet staan als het cpp bestand.

Als de filename tussen <> staat dan moet de compiler voor het headerbestand zorgen, die staat dan meestal in een include dir.

C# is trouwens wel een stuk makkelijker om mee te beginnen, dan kun je gewoon een SerialPort object op het form slepen.

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.


  • michielske
  • Registratie: Maart 2006
  • Laatst online: 30-11 09:05
ik heb ondertussen een ander compiler geinstalleerd en deze kan wel met de headers overweg maar nu zit ik weer vast bij het volgende. Ik heb al op de site gekeken waar ik de broncode en de header files heb gedownload.

Momenteel gebruik ik Dev-C++ 4.9.9.2 gratis compiler

Dit is de code die ik wil comileren:

#define STRICT
#include <tchar.h>
#include <windows.h>
#include "serial.h"
int WINAPI _tWinMain
(
HINSTANCE /*hInst*/,
HINSTANCE /*hInstPrev*/,
LPTSTR /*lptszCmdLine*/,
int /*nCmdShow*/
)
{
CSerial serial;
// Attempt to open the serial port (COM2)
serial.Open(_T("COM2"));
// Setup the serial port (4800,N81) using hardware handshaking
serial.Setup(CSerial::EBaud4800,CSerial::EData8,CSerial::EParNone,CSerial::EStop1);
serial.SetupHandshaking(CSerial::EHandshakeHardware);
// The serial port is now ready and we can send/receive data. If
// the following call blocks, then the other side doesn't support
// hardware handshaking.
serial.Write("Hello world");
// Close the port again
serial.Close();
return 0;
}



Ik heb rekening gehouden met de aanhalingstekens zoals bobo1on1 had verteld.

Dit is de bijkomende headerfile:

// Serial.h - Definition of the CSerial class
//
// Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl)
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#ifndef __SERIAL_H
#define __SERIAL_H
//////////////////////////////////////////////////////////////////////
// The SERIAL_DEFAULT_OVERLAPPED defines if the default open mode uses
// overlapped I/O. When overlapped I/O is available (normal Win32
// platforms) it uses overlapped I/O. Windows CE doesn't allow the use
// of overlapped I/O, so it is disabled there by default.
#ifndef SERIAL_DEFAULT_OVERLAPPED
#ifndef SERIAL_NO_OVERLAPPED
#define SERIAL_DEFAULT_OVERLAPPED true
#else
#define SERIAL_DEFAULT_OVERLAPPED false
#endif
#endif
//////////////////////////////////////////////////////////////////////
//
// CSerial - Win32 wrapper for serial communications
//
// Serial communication often causes a lot of problems. This class
// tries to supply an easy to use interface to deal with serial
// devices.
//
// The class is actually pretty ease to use. You only need to open
// the COM-port, where you need to specify the basic serial
// communication parameters. You can also choose to setup handshaking
// and read timeout behaviour.
//
// The following serial classes are available:
//
// CSerial - Serial communication support.
// CSerialEx - Serial communication with listener thread for events
// CSerialSync - Serial communication with synchronized event handler
// CSerialWnd - Asynchronous serial support, which uses the Win32
// message queue for event notification.
// CSerialMFC - Preferred class to use in MFC-based GUI windows.
//
//
// Pros:
// -----
// - Easy to use (hides a lot of nasty Win32 stuff)
// - Fully ANSI and Unicode aware
//
// Cons:
// -----
// - Little less flexibility then native Win32 API, however you can
// use this API at the same time for features which are missing
// from this class.
// - Incompatible with Windows 95 or Windows NT v3.51 (or earlier),
// because CancelIo isn't support on these platforms. Define the
// SERIAL_NO_CANCELIO macro for support of these platforms as
// well. When this macro is defined, then only time-out values of
// 0 or INFINITE are valid.
//
//
// Copyright (C) 1999-2003 Ramon de Klein
// (Ramon.de.Klein@ict.nl)
class CSerial
{
// Class enumerations
public:
// Communication event
typedef enum
{
EEventUnknown = -1, // Unknown event
EEventNone = 0, // Event trigged without cause
EEventBreak = EV_BREAK, // A break was detected on input
EEventCTS = EV_CTS, // The CTS signal changed state
EEventDSR = EV_DSR, // The DSR signal changed state
EEventError = EV_ERR, // A line-status error occurred
EEventRing = EV_RING, // A ring indicator was detected
EEventRLSD = EV_RLSD, // The RLSD signal changed state
EEventRecv = EV_RXCHAR, // Data is received on input
EEventRcvEv = EV_RXFLAG, // Event character was received on input
EEventSend = EV_TXEMPTY, // Last character on output was sent
EEventPrinterError = EV_PERR, // Printer error occured
EEventRx80Full = EV_RX80FULL, // Receive buffer is 80 percent full
EEventProviderEvt1 = EV_EVENT1, // Provider specific event 1
EEventProviderEvt2 = EV_EVENT2, // Provider specific event 2
}
EEvent;
// Baudrate
typedef enum
{
EBaudUnknown = -1, // Unknown
EBaud110 = CBR_110, // 110 bits/sec
EBaud300 = CBR_300, // 300 bits/sec
EBaud600 = CBR_600, // 600 bits/sec
EBaud1200 = CBR_1200, // 1200 bits/sec
EBaud2400 = CBR_2400, // 2400 bits/sec
EBaud4800 = CBR_4800, // 4800 bits/sec
EBaud9600 = CBR_9600, // 9600 bits/sec
EBaud14400 = CBR_14400, // 14400 bits/sec
EBaud19200 = CBR_19200, // 19200 bits/sec (default)
EBaud38400 = CBR_38400, // 38400 bits/sec
EBaud56000 = CBR_56000, // 56000 bits/sec
EBaud57600 = CBR_57600, // 57600 bits/sec
EBaud115200 = CBR_115200, // 115200 bits/sec
EBaud128000 = CBR_128000, // 128000 bits/sec
EBaud256000 = CBR_256000, // 256000 bits/sec
}
EBaudrate;
// Data bits (5-8)
typedef enum
{
EDataUnknown = -1, // Unknown
EData5 = 5, // 5 bits per byte
EData6 = 6, // 6 bits per byte
EData7 = 7, // 7 bits per byte
EData8 = 8 // 8 bits per byte (default)
}
EDataBits;
// Parity scheme
typedef enum
{
EParUnknown = -1, // Unknown
EParNone = NOPARITY, // No parity (default)
EParOdd = ODDPARITY, // Odd parity
EParEven = EVENPARITY, // Even parity
EParMark = MARKPARITY, // Mark parity
EParSpace = SPACEPARITY // Space parity
}
EParity;
// Stop bits
typedef enum
{
EStopUnknown = -1, // Unknown
EStop1 = ONESTOPBIT, // 1 stopbit (default)
EStop1_5 = ONE5STOPBITS,// 1.5 stopbit
EStop2 = TWOSTOPBITS // 2 stopbits
}
EStopBits;
// Handshaking
typedef enum
{
EHandshakeUnknown = -1, // Unknown
EHandshakeOff = 0, // No handshaking
EHandshakeHardware = 1, // Hardware handshaking (RTS/CTS)
EHandshakeSoftware = 2 // Software handshaking (XON/XOFF)
}
EHandshake;
// Timeout settings
typedef enum
{
EReadTimeoutUnknown = -1, // Unknown
EReadTimeoutNonblocking = 0, // Always return immediately
EReadTimeoutBlocking = 1 // Block until everything is retrieved
}
EReadTimeout;
// Communication errors
typedef enum
{
EErrorUnknown = 0, // Unknown
EErrorBreak = CE_BREAK, // Break condition detected
EErrorFrame = CE_FRAME, // Framing error
EErrorIOE = CE_IOE, // I/O device error
EErrorMode = CE_MODE, // Unsupported mode
EErrorOverrun = CE_OVERRUN, // Character buffer overrun, next byte is lost
EErrorRxOver = CE_RXOVER, // Input buffer overflow, byte lost
EErrorParity = CE_RXPARITY,// Input parity error
EErrorTxFull = CE_TXFULL // Output buffer full
}
EError;
// Port availability
typedef enum
{
EPortUnknownError = -1, // Unknown error occurred
EPortAvailable = 0, // Port is available
EPortNotAvailable = 1, // Port is not present
EPortInUse = 2 // Port is in use
}
EPort;
// Construction
public:
CSerial();
virtual ~CSerial();
// Operations
public:
// Check if particular COM-port is available (static method).
static EPort CheckPort (LPCTSTR lpszDevice);
// Open the serial communications for a particular COM port. You
// need to use the full devicename (i.e. "COM1") to open the port.
// It's possible to specify the size of the input/output queues.
virtual LONG Open (LPCTSTR lpszDevice, DWORD dwInQueue = 0, DWORD dwOutQueue = 0, bool fOverlapped = SERIAL_DEFAULT_OVERLAPPED);
// Close the serial port.
virtual LONG Close (void);
// Setup the communication settings such as baudrate, databits,
// parity and stopbits. The default settings are applied when the
// device has been opened. Call this function if these settings do
// not apply for your application. If you prefer to use integers
// instead of the enumerated types then just cast the integer to
// the required type. So the following two initializations are
// equivalent:
//
// Setup(EBaud9600,EData8,EParNone,EStop1)
//
// or
//
// Setup(EBaudrate(9600),EDataBits(8),EParity(NOPARITY),EStopBits(ONESTOPBIT))
//
// In the latter case, the types are not validated. So make sure
// that you specify the appropriate values.
virtual LONG Setup (EBaudrate eBaudrate = EBaud9600,
EDataBits eDataBits = EData8,
EParity eParity = EParNone,
EStopBits eStopBits = EStop1);
// Set/clear the event character. When this byte is being received
// on the serial port then the EEventRcvEv event is signalled,
// when the mask has been set appropriately. If the fAdjustMask flag
// has been set, then the event mask is automatically adjusted.
virtual LONG SetEventChar (BYTE bEventChar, bool fAdjustMask = true);
// Set the event mask, which indicates what events should be
// monitored. The WaitEvent method can only monitor events that
// have been enabled. The default setting only monitors the
// error events and data events. An application may choose to
// monitor CTS. DSR, RLSD, etc as well.
virtual LONG SetMask (DWORD dwMask = EEventBreak|EEventError|EEventRecv);
// The WaitEvent method waits for one of the events that are
// enabled (see SetMask).
virtual LONG WaitEvent (LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
// Setup the handshaking protocol. There are three forms of
// handshaking:
//
// 1) No handshaking, so data is always send even if the receiver
// cannot handle the data anymore. This can lead to data loss,
// when the sender is able to transmit data faster then the
// receiver can handle.
// 2) Hardware handshaking, where the RTS/CTS lines are used to
// indicate if data can be sent. This mode requires that both
// ports and the cable support hardware handshaking. Hardware
// handshaking is the most reliable and efficient form of
// handshaking available, but is hardware dependant.
// 3) Software handshaking, where the XON/XOFF characters are used
// to throttle the data. A major drawback of this method is that
// these characters cannot be used for data anymore.
virtual LONG SetupHandshaking (EHandshake eHandshake);
// Read operations can be blocking or non-blocking. You can use
// this method to setup wether to use blocking or non-blocking
// reads. Non-blocking reads is the default, which is required
// for most applications.
//
// 1) Blocking reads, which will cause the 'Read' method to block
// until the requested number of bytes have been read. This is
// useful if you know how many data you will receive.
// 2) Non-blocking reads, which will read as many bytes into your
// buffer and returns almost immediately. This is often the
// preferred setting.
virtual LONG SetupReadTimeouts (EReadTimeout eReadTimeout);
// Obtain communication settings
virtual EBaudrate GetBaudrate (void);
virtual EDataBits GetDataBits (void);
virtual EParity GetParity (void);
virtual EStopBits GetStopBits (void);
virtual EHandshake GetHandshaking (void);
virtual DWORD GetEventMask (void);
virtual BYTE GetEventChar (void);
// Write data to the serial port. Note that we are only able to
// send ANSI strings, because it probably doesn't make sense to
// transmit Unicode strings to an application.
virtual LONG Write (const void* pData, size_t iLen, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
virtual LONG Write (LPCSTR pString, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
// Read data from the serial port. Refer to the description of
// the 'SetupReadTimeouts' for an explanation about (non) blocking
// reads and how to use this.
virtual LONG Read (void* pData, size_t iLen, DWORD* pdwRead = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
// Send a break
LONG Break (void);
// Determine what caused the event to trigger
EEvent GetEventType (void);
// Obtain the error
EError GetError (void);
// Obtain the COMM and event handle
HANDLE GetCommHandle (void) { return m_hFile; }
// Check if com-port is opened
bool IsOpen (void) const { return (m_hFile != 0); }
// Obtain last error status
LONG GetLastError (void) const { return m_lLastError; }
// Obtain CTS/DSR/RING/RLSD settings
bool GetCTS (void);
bool GetDSR (void);
bool GetRing (void);
bool GetRLSD (void);
// Purge all buffers
LONG Purge (void);
protected:
// Internal helper class which wraps DCB structure
class CDCB : public DCB
{
public:
CDCB() { DCBlength = sizeof(DCB); }
};
// Attributes
protected:
LONG m_lLastError; // Last serial error
HANDLE m_hFile; // File handle
EEvent m_eEvent; // Event type
DWORD m_dwEventMask; // Event mask
#ifndef SERIAL_NO_OVERLAPPED
HANDLE m_hevtOverlapped; // Event handle for internal overlapped operations
#endif
protected:
// Check the requirements
void CheckRequirements (LPOVERLAPPED lpOverlapped, DWORD dwTimeout) const;
// CancelIo wrapper (for Win95 compatibility)
BOOL CancelCommIo (void);
};
#endif // __SERIAL_H



Dit is wat ik krijg als ik het probeer te compilen:

Compiler: Default compiler
Bezig met uitvoeren van g++.exe...
g++.exe "C:\Documents and Settings\Bart\Bureaublad\Naamloos1.cpp" -o "C:\Documents and Settings\Bart\Bureaublad\Naamloos1.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
C:\DOCUME~1\Bart\LOCALS~1\Temp/cc2Raaaa.o(.text+0x46):Naamloos1.cpp: undefined reference to `CSerial::CSerial()'
C:\DOCUME~1\Bart\LOCALS~1\Temp/cc2Raaaa.o(.text+0x78):Naamloos1.cpp: undefined reference to `CSerial::Open(char const*, unsigned long, unsigned long, bool)'
C:\DOCUME~1\Bart\LOCALS~1\Temp/cc2Raaaa.o(.text+0xa3):Naamloos1.cpp: undefined reference to `CSerial::Setup(CSerial::EBaudrate, CSerial::EDataBits, CSerial::EParity, CSerial::EStopBits)'
C:\DOCUME~1\Bart\LOCALS~1\Temp/cc2Raaaa.o(.text+0xb6):Naamloos1.cpp: undefined reference to `CSerial::SetupHandshaking(CSerial::EHandshake)'
C:\DOCUME~1\Bart\LOCALS~1\Temp/cc2Raaaa.o(.text+0xe1):Naamloos1.cpp: undefined reference to `CSerial::Write(char const*, unsigned long*, _OVERLAPPED*, unsigned long)'
C:\DOCUME~1\Bart\LOCALS~1\Temp/cc2Raaaa.o(.text+0xec):Naamloos1.cpp: undefined reference to `CSerial::Close()'
C:\DOCUME~1\Bart\LOCALS~1\Temp/cc2Raaaa.o(.text+0xfe):Naamloos1.cpp: undefined reference to `CSerial::~CSerial()'
C:\DOCUME~1\Bart\LOCALS~1\Temp/cc2Raaaa.o(.text+0x128):Naamloos1.cpp: undefined reference to `CSerial::~CSerial()'
collect2: ld returned 1 exit status
Uitvoering voltooid


Is er iemand die weet wat ik verkeerd doe of dat ik nog iets vergeten ben?

Ik ben er al uren me bezig geweest en ik zit momenteel compleet vast.
p.s. ik heb het in tabelvorm gezet om het iets vlotter te laten lezen.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
ik heb ondertussen een ander compiler geinstalleerd en deze kan wel met de headers overweg....
Beste TS, dit is echt een gevalletje PBKAC en niet van de compiler. De eerste keer had je het include pad niet goed en bij je 2e keer heb je het library pad niet goed. Lees ff de installatiedocs die bij je compilers zitten want dit soort dingen zijn al zo oud als de weg naar Rome.

Ter verduidelijking

Je compiler heeft maar 3 dingen nodig en van alle drie moet jij zorgen dattie ze kan vinden:
- jouw sources
- headers
- libraries

[ Voor 16% gewijzigd door farlane op 14-03-2007 09:22 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Zie farlane idd. We gaan er hier vanuit dat je weet met welke zaken je bezig bent en zo niet, dat je dat zelf probeert uit te zoeken. Zaken als compile errors zou je dan ook zonder problemen moeten kunnen oplossen (de meldingen zijn vaak redelijk duidelijk).

Je sourcecode dumpen tesamen met de error en vragen om wat je verkeerd doet is hier nog steeds not done. We verwachten hier van je dat je zelf opzoek bent gegaan naar een oplossing en dat je ook aangeeft wat je nu zelf het geprobeerd. Dit mist in je laatste post. Ook dump je je volledige sourcecode, iets wat helemaal niet nodig is. Probeer als je sourcecode post om alleen de relevante stukken te posten.

Zoals farlane ook al aangeeft: lees de installatie docs van de gebruikte compiler / IDE eens door om te kijken hoe zoiets werkt. Mocht je echt problemen houden met de gebruikte compiler dan zou je een nieuwe post in DTE kunnen maken met je probleem, maar let daarbij op dat je voldoende informatie geeft. Als je problemen blijft houden met je implementatie dan kan je hier een nieuw topic openen maar ook dan geld weer: geef voldoende informatie. Een foutmelding en sourcecode is zeker niet voldoende zoals je ook kan lezen in Programming Beleid (en dan met name in
Programming Beleid - De Quickstart)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.