|
#ifdef OS_WINDOWS
# define S7API __stdcall
#else
# define S7API
#endif
Because of I use windows C++,I dont have to this with my functions,right?
|
|
|
|
|
It depends. See also my above post.
Such constructs are not necessary for C++. But they are required when calling C functions from C++ code depending on how the C code has been build. If the C code is part of your project and you set the project options to compile C code as C++ (that is: use the C++ compiler also for C code), there is no need for the macro. But if the C code has been compiled as C for Windows, it must be used.
|
|
|
|
|
As a result of these informations, as far as I understand,I can call the functions just with name that intellisense show me functions,so that no problem with snap7 and I can create functions as I always do.This would be strange with macro.
|
|
|
|
|
This is not a C language issue, it is something to do with Qt. S7API is a define variable that will be in one of the Qt header files, and perhaps also in the documentation.
|
|
|
|
|
|
This is my logic to find the longest word in C.
void find_long(char *a)
{
int l,i,l1=0,j=0,l2=0;
char b[50],c[50];
l=strlen(a);
for(i=0;i<l;i++){
if(a[i]!=" " ){
="" b[j]="a[i];
" printf("%c="" ",b[j]);
="" j++;}
="" else="" if(a[i]="='" '){
="" ;
="" if(strlen(b)="">l1){
strcpy(c,b);
l1=strlen(b);
j=0;
}
else{
printf("\nEOF");}
}
}
printf("\nlongest is \n");
printf(c);
But it is not taking the last word I am giving. What is wrong here?
|
|
|
|
|
You only check the length of each word when you encounter a space character. So if the last character is not a space then when the loop ends you still have an unchecked word in array b. Your code would be clearer if you formatted it properly and used <pre> tags round it. And also used meaningful names for your variables rather than single letters.
|
|
|
|
|
what condition I can add here to avoid it?
|
|
|
|
|
At the end of the loop you just need to check the last word in array b.
|
|
|
|
|
|
It is essential to "see" the code properly indented and formatted. Then you can recognise - besides the problems mentioned by Richard - that there is a missing closing parentheses (which should also issue a compiler error if not present behind the posted code):
void find_long(char *a)
{
int l,i,l1=0,j=0,l2=0;
char b[50],c[50];
l=strlen(a);
for (i = 0; i < l; i++) {
if (a[i] != ' ') {
b[j] = a[i];
printf("%c ",b[j]);
j++;
}
else if (a[i] == ' ') {
b[j] = '\0';
if (strlen(b) > l1) {
strcpy(c,b);
l1 = strlen(b);
}
j = 0;
}
else {
printf("\nEOF");}
}
}
printf("\nlongest is \n");
printf(c);
}
|
|
|
|
|
Try
#include <stdio.h>
enum State
{
INSIDE_BLANKS,
INSIDE_WORD
};
void find_longest_word( const char * a, const char ** pps, const char ** ppe);
int main()
{
const char * foo = "alpha beta gamma delta epsilon ";
const char *ps, *pe;
find_longest_word( foo, &ps, &pe);
if ( pe-ps > 0)
{
printf("longest word length = %ld\n", (pe-ps));
while (ps != pe)
{
printf("%c", *ps);
++ps;
}
printf("\n");
}
return 0;
}
void find_longest_word( const char * a, const char ** pps, const char **ppe)
{
const char * ps = a;
const char * pe = a;
*pps = *ppe = a;
enum State state = INSIDE_BLANKS;
while ( *a != '\0')
{
if ( state == INSIDE_BLANKS)
{
if ( *a != ' ')
{
state = INSIDE_WORD;
ps = a;
}
}
else {
if ( *a == ' ')
{
pe = a;
if ( pe - ps > *ppe - *pps)
{
*pps = ps;
*ppe = pe;
}
state = INSIDE_BLANKS;
}
}
++a;
}
if ( state == INSIDE_WORD)
{
if ( pe - ps > *pps - *pps)
{
*pps = ps;
*ppe = pe;
}
}
}
|
|
|
|
|
Hi. I have a problem when I am trying to convert CString to CByteArray. Here is the code, and the result:
CByteArray arrByte2;
BYTE* pByteArray = (PBYTE)(LPCTSTR)sSerial;
arrByte2.SetSize(sSerial.GetLength());
memcpy(arrByte2.GetData(), pByteArray, m_sSerial.GetLength());
these values, sSerial, pByteArray and arrByte2 are taken from VS debugger.
Why arrByte2 are having "ýýýý««««««««" on tail ? What I am missing here ?
Thank you for any hint.
modified 9-Jan-18 6:25am.
|
|
|
|
|
It looks like the VS debugger is dumping out additional (or the allocated) memory. Is it for exactly the posted code? Or is arrByte2 declared somewhere else and has been used before?
You are also copying m_sSerial.GetLength() bytes while the array size has been set to sSerial.GetLength() . If m_sSerial is a longer string, you will have a buffer overrun.
Finally, your casting should be
const BYTE* pByteArray = reinterpret_cast<const BYTE*>(sSerial.GetString()); That will at least keep the constness of the string but fail too for Unicode builds when sSerial is not explicitly declared as CStringA .
You might call arrByte2.GetSize() and ignore the additional output if that is as expected.
|
|
|
|
|
Flaviu2 wrote: Why arrByte2 are having "ýýýý««««««««" on tail ? What I am missing here ?
Thank you for any hint.
It does NOT have this trash "on tail". This trash is behind the arrByte2.
Debugger interprets its content as characters and cannot find the actual "end" of array since you did not copy the terminated NULL from the CString.
|
|
|
|
|
You need to copy the length of the string + 1 to get the ending '\0' to terminate a C string
Very basic .. without it the string keeps going in C terms which is exactly what the debugger is showing with rubbish that was in the buffer.
In vino veritas
|
|
|
|
|
Thank you all of you. Yes, that was the problem, I should put
arrByte2.SetSize(sSerial.GetLength() + 1);
|
|
|
|
|
Hi
It is my understanding that local variables of a Multithread application i.e those declared on the stack for each function are thread safe. Each thread BP,SP registers have a unique address so variables declared on the stack are all unique to each thread. Am I correct in understanding this ?
Thanks
|
|
|
|
|
Each thread has its own stack. When calling a function from different threads, the local function variables reside on the stack of the thread from where the function has been called. So it is thread safe.
But note that this does not apply to local static variables. While also local variables (can't be accessed from outside of the function), there is only one instance of such variables. Accessing them must be guarded (locks, atomic operations) and the function must not return a pointer to them to make the function thread safe.
|
|
|
|
|
Thanks I think of static local variables as global. I am using a local variable as a switch if local variable BOOL foo = TRUE for thread A, It (BOOL foo is not the same) for thread B
is there any reason in a Multithread application I would have to guard them (local variables non static ) there are no references to them by pointers
Thanks
|
|
|
|
|
You only have to guard shared variables (like static variables). Variables on the stack are safe.
|
|
|
|
|
THANKS SO MUCH
|
|
|
|
|
I want to print elements of array a.
My print fun is :
void print(int *a){
int i;
for(i=0;i<3;i++){
printf("%d\n",a[i]);
}
}
which works fine. But if I give :
void print(int *a[]){
int i;
for(i=0;i<3;i++){
printf("%d\n",a[i]);
}
}
(array a[] defined in main.)
its not working.What makes the difference?
|
|
|
|
|
The difference is in the prototypes :
void print(int *a) vs
void print(int *a[])
The first takes a pointer to integer. The second takes an array of pointers to integers.
To make the second function work you have to dereference a pointer :
printf( "%d\n", *a[i] );
|
|
|
|
|
the equivalent of
void print(int *a)
with array notation is
void print(int a[])
|
|
|
|