|
Well,
The My Program Suite is out in the field since 2005. It runs on XP. It works well, We provide the terminals. built out of recycled computers. Our customers do not view these terminals as computers, but as Tills.
The code is under licence, so I get an annual pay for each license, and everyone is happy. I am in a niche market, without any local competition. The working code base will never be migrated to another Software platform.
Also, because of the persistence of never changing the basic user interface for staff, other than in minimal ways, we have reduced staff training costs for our clients to close to zero.
All Bugs are long resolved, the program works as it states on the Can, so, why should I try to improve.
The Database we use is totally proprietary, developed in our lab. Our Database is hence extremely resistant to Hacking, the format and organisation is private to the company!
We do not use standard software because it is too easy to hack! Our protocols are always non standard, by slightly deviating from the standard, in un expected ways.
Using C#, what you write gets translated to 'Universal Intermediate Code' to run on the Just in Time c# virtual machine. That intermediate code can easily be decompiled to the original source code, with the loss of function and naming conventions We as an organisation will never entertain it as a way to distribute our code!
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: The My Program Suite is out in the field since 2005...
That doesn't have anything to do with your statement about modern programming languages.
Bram van Kampen wrote: We do not use standard software because it is too easy to hack!
90% of data loss from companies is due to internal breaches. An employee walks off with the data.
Most of the rest is based on employees doing something wrong - like posting their login on a postit on the box.
Actual technical "hacking" from outside sources is rare (compared to all business losses).
Bram van Kampen wrote: Using C#, what you write gets translated to 'Universal Intermediate Code' to run on the Just in Time c# virtual machine. That intermediate code can easily be decompiled to the original source code, with the loss of function and naming conventions We as an organisation will never entertain it as a way to distribute our code!
First I know exactly how C# works. I also know how java, perl, C++, C, assembler and even SQL on various boxes works. I have in fact written several custom compilers and interpreters and have written an IDE as well.
Secondly I can see how you feel that that protects your IP, but doesn't have much to do with the statement that I originally responded to.
|
|
|
|
|
Lots of samples: sockets c - Google Search[^]. The basics of sockets have not changed for years so you can work from any of the more modern samples in an old compiler: my first sockets program was developed using Visual C++ 6.0 (so long ago).
|
|
|
|
|
I have a task of passing variable values in an array to a function.
Of course compiler cannot reinitialize same array with different values.
Putting the code in a block works.
Awful hack.
So what is "the proper " way to accomplish the task in C++ ?
Multidimensional array is impractical in my case.
Cheers Vaclav
{
int *ipTestValue;
int a[32] = {1,2,3};
ipTestValue =&a[0];
vna.utility.TestArray(ipTestValue);
}
{
int *ipTestValue;
int a[32] = {1,2,3,4,5,6,7};
ipTestValue =&a[0];
vna.utility.TestArray(ipTestValue);
}
|
|
|
|
|
What exactly are you wanting TestArray() to do?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
It does nothing useful, just test prints the values passed to it.
The question is about how to initialize / reinitialize THE ARRAY of the values passed.
|
|
|
|
|
Have you tried memset() or memcpy() ? It's not ideal because (currently) TestArray() does not know how much room it has to work with.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Why the extra pointer?
int a[32] = {1,2,3};
vna.utility.TestArray(a);
for (i = 1; i <= 7; ++i)
{
a[i] = i;
}
vna.utility.TestArray(a);
|
|
|
|
|
Here is a partial test solution using memset.
Compiler likes it.
There is a small problem
"This function copies the value of c (converted to an unsigned char) into each of the first size bytes
of the object beginning at block. It returns the value of block. "
I am getting only the first value passed and it fills all 32 bits
Index 0 pDataArray 37373737
Index 1 pDataArray 37373737
Index 2 pDataArray 37373737
Index 3 pDataArray 37373737
Obviously I am using the pDataArray
and memset (pointers ?) wrong, as usual.
Could use some more help.
Thanks
Cheers
Vaclav
int *pDataArray;
int a[] = { 55, 1, 2, 3 };
int iTestIndex = 0;
memset(pDataArray, *a, sizeof(a));
do {
cout << "index " << dec << iTestIndex; cout << " array 0x" << hex << +a[iTestIndex] << endl;
} while (iTestIndex++ != sizeof(a)/4);
iTestIndex = 0;
do {
cout << "index " << dec << iTestIndex; cout << " pDataArray " << hex << +pDataArray[iTestIndex] << endl;
} while (iTestIndex++ != sizeof(a)/4);
exit(1);
int b[32] = { 4, 5, 6 };
memset(pDataArray, b[32], sizeof(b));
iTestIndex = 0;
do {
cout << "index " << dec << iTestIndex << endl;
cout << " pDataArray " << hex << +pDataArray[iTestIndex] << endl;
} while (iTestIndex++ < 16);
|
|
|
|
|
Most of that code is not going to do what you think.
memset(pDataArray, *a, sizeof(a)); You are trying to fill the area pointed to by pDataArray , but you never initialise it to point to anything, so it will likely crash your application. Also you are trying to fill pDataArray with the value stored in the first element of a . Is that what you actually mean?
memset(pDataArray, b[32], sizeof(b)); You are trying to fill pDataArray with the value stored in a random element: b[32] refers to a cell 1 beyond the end of that array.
In both cases why are you using the memset (presumably you actually mean memcpy ), since you do not use pDataArray for anything useful?
|
|
|
|
|
Vaclav_ wrote: int *pDataArray;
int a[] = { 55, 1, 2, 3 };
int iTestIndex = 0;
memset(pDataArray, *a, sizeof(a));
This code looks wrong. You didn't allocate any memory for the Quote: pDataArray
|
|
|
|
|
Here is the last modification of the code.
It fulfills the task to be able to reinitialize the array, actually passing a pointer with new data to called function.
The "test function" process / role was immaterial, as long as correct pointer with correct data was received. .
All replies were generaly helpful, which I appreciate.
Thanks.
Cheers
int *pDataArray[32];
int a[] = {55, 1, 2, 3};
int iTestIndex = 0;
memcpy(pDataArray, a, sizeof(a));
do {
cout << "index " << dec << iTestIndex; cout << " array 0x" << hex << +a[iTestIndex] << endl;
}while (iTestIndex++ != sizeof(a)/4);
iTestIndex = 0;
do {
cout << "index " << dec << iTestIndex; cout << " pDataArray a " << hex << +pDataArray[iTestIndex] << endl;
}while (iTestIndex++ != sizeof(a)/4);
int b[32] = {4, 5, 6};
memcpy(pDataArray, b, sizeof(b));
iTestIndex = 0;
do {
cout << "index " << dec << iTestIndex << endl;
cout << " pDataArray b " << hex << +pDataArray[iTestIndex] << endl;
}while (iTestIndex++ != sizeof(b)/4);
|
|
|
|
|
No, I am afraid it is still wrong. You have the following line of code:
int *pDataArray[32];
That creates pDataArray as an array of integer pointers, not an array of integers. And what is the purpose of this variable, since you never do anything useful with it? Maybe if you actually explained what problem you are trying to solve we could make some useful suggestions.
Also in the expressions sizeof(a)/4 , it is better to use sizeof(a)/sizeof(a[0]) . Then if a is changed to some other type, the calculation will still be correct.
|
|
|
|
|
/*Write a programme to check a password if it has an uppercase letter, a digit and a special symbol. (I have provided what I have done and I am not getting the output as required. Need explanation on where I messed it up.)*/
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
int i;
int tuna;
do{
printf("Enter a password:%c \n", tuna);
scanf(" %c", &tuna);
} while( tuna != (isupper(tuna), isalpha(tuna), isdigit(tuna)) );
return 0;
}
|
|
|
|
|
I see several things wrong with your approach: 1) The first time through the loop, tuna is uninitialized so the printf() statement is going to print an incorrect character, 2) The scanf() statement is expecting to receive a char (%c ) but you are giving it the address of an int , 3) The isupper() , isalpha() , and isdigit() functions return a non-zero value if the parameter is an uppercase alphabetic letter, and zero otherwise. You are then comparing this to tuna . While syntactically correct, it is nonsensical, 4) If your password is to hold numbers, letters, and symbols, the password type should not be an int , but should probably be a string .
Consider something like:
int reqd = 0;
char pwd[32];
printf("Enter a password: ");
scanf("%s", pwd);
for (int x = 0; x < strlen(pwd); x++)
{
if (isupper(pwd[x]))
reqd |= 0x1;
else if (isalpha(pwd[x]))
reqd |= 0x2;
else if (isdigit(pwd[x]))
reqd |= 0x4;
}
if (reqd == 0x07)
printf("Requirements have been met.\n");
else
printf("Requirements have NOT been met.\n");
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
I didn't get the logic behind "reqd" in the if else part. Can you please explain?
|
|
|
|
|
I presume this is for a class and I suspect you have not been taught bit manipulation. Unless you learn about it yourself, you probably do not want to hand in a solution that uses it.
|
|
|
|
|
jschell wrote: Unless you learn about it yourself, you probably do not want to hand in a solution that uses it. Good point. I didn't think through my offering well enough.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
You could (possibly) simplify to something like:
int upper = 0;
int alpha = 0;
int digit = 0;
...
if (isupper(pwd[x]))
upper = 1;
else if (isalpha(pwd[x]))
alpha = 1;
else if (isdigit(pwd[x]))
digit = 1;
...
if (upper == 1 && alpha == 1 && digit == 1)
printf("Requirements have been met.\n");
else
printf("Requirements have NOT been met.\n");
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
modified 24-Dec-18 9:19am.
|
|
|
|
|
Your code is entering a character (singular) then checking it.
You need to enter a word (multiple characters) and THEN check that entire word for one character of each type.
|
|
|
|
|
Message Closed
modified 22-Dec-18 11:53am.
|
|
|
|
|
Hex 1A (equivalent to Ctrl-Z) is an end of file byte in a text file. You need to change your code so that you open the file in binary mode.
|
|
|
|
|
My worker thread is passing message to the mainframe window with PostMessage.
There is a situation when the PostMessage fails with the ERROR_NOT_ENOUGH_QUOTA error (and sometimes just not fails, but the message is not handled)
That thread does not call PostMessage a lot, maybe 4, 5 times in all when it is used.
There is someone else that PostMessage and I have a hard time figuring out who/what, even if the messages are system messages or our own.
What would be the best way to track down unruly messages that fills the message queue ?
=========================
Problem found.
Recent modifications created an update loop.
Thanks.
I'd rather be phishing!
modified 20-Dec-18 11:37am.
|
|
|
|
|
Maximilien wrote: My worker thread is passing message to the mainframe window with PostMessage. What type of messages (e.g., status)?
Maximilien wrote:
That thread does not call PostMessage a lot, maybe 4, 5 times in all when it is used. Then something else is hitting the queue's 10,000 limit.
Maximilien wrote:
What would be the best way to track down unruly messages that fills the message queue ? Is your main thread blocked such that it is unable to process messages in its queue?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
The main Application/UI thread is not blocked, I can still interact with it and manually stop the worker thread.
The message is to trigger a function in the MainFrame that will set an event (SetEvent).
The handler for the MESSAGEID id is never called. (breakpoint never triggered); so the event is never triggered.
(I know the INFINITE is not the best idea, but it is approved)
My pseudo-code is something like that :
Worker Thread:
void f(CWnd* p)
{
p->PostMessage(MESSAGEID, 0, 0 );
const DWORD dwEvent = WaitForMultipleObjects(NB_EVENT_REGISTERED, ghEventList, FALSE, INFINITE);
}
Main UI thread.
ON_MESSAGE(MESSAGEID, OnMESSAGEID )
LRESULT CMainFrame::OnMESSAGEID (WPARAM wParam, LPARAM lParam)
{
SetEvent(ghEventList[0]);
}
I'd rather be phishing!
|
|
|
|
|