我有一个奇怪的问题.请考虑以下情形:
关于事情如何发生的伪代码:(请在这里忽略语法正确性)
MainWindowClass mainObj;
void MainWindowClass::OnSomeButtonClick()
{
SomeDialogClass someDialogObj;
someDialogObj.DoModal();
}
int MainWindowClass::doTask()
{
// Do work
if(ERROR)
{
MessageBox("Yikes! Something went wrong.", "Error", MB_OK);
return ERROR;
}
}
///////////////////////////////////////////////////////////////////
// Meanwhile, in another file,
extern MainWindowClass mainObj;
void SomeDialogClass::OnCancel()
{
// Do all cleanup and close dialog
}
int SomeDialogClass::workerThreadFunc()
{
return mainObj.doTask();
}
int SomeDialogClass::DoModal()
{
AfxBeginThread(workerThreadFunc);
// Do all other work and then wait for the worker thread
}
Run Code Online (Sandbox Code Playgroud)
我的问题是双重的: …
最近几次停电后,我的计算机已经搞得很乱(BSODs时不时,整个操作系统表现得非常奇怪).
现在我有一个程序在我的计算机弄乱之前运行得非常好.这个程序基本上只是创建一个文件使用CreateFile和写入它WriteFile.这个程序还有其他东西基于这个文件做他们的事情.我注意到整个程序也表现得很奇怪.
我的调试结果:
CreateFile,文件被创建应该在哪里(使用资源管理器和命令行检查).WriteFile 没有写入文件(再次使用资源管理器和命令行检查).WriteFile,每当我在资源管理器中双击该文件或对该文件执行任何操作时,所有操作都表现为该文件不存在.在我停止我的程序并退出IDE之后,我去了资源管理器并试图删除包含上面创建的文件的文件夹,它向我展示了这个:

该文件已被删除.
注意:上述情况并非总是如此.
由于上面的调试,我得出结论,由于我的整个操作系统表现得很奇怪,我的程序也很奇怪.我的计划没有错(因为在那些严重的停电之前一切都很完美).
无论如何,微软有这个说错误.基本上我的硬盘有很多坏道.
我的问题:有没有办法以编程方式检查C中的硬盘是否正常?该检测不需要100%正确.但是,我确实希望这个检查非常快(因为我做了大量的写操作等).
我想要这个检查,因为截至目前,我的程序的其余部分认为该文件已准备就绪(因为没有返回错误)并且随后出现各种奇怪的行为.作为一个可能不知道他/她的硬盘被驱动的用户,我希望我的程序建议运行磁盘检查.
我想知道如何将结构传递给线程.我编写了一个示例应用程序,我在其中声明了一个结构main并尝试将其传递给线程.
这是我的代码:
DWORD WINAPI Name1(LPVOID lparam)
{
data x;
x.name[15]="Sarah";
x.DOB="19/10/2007";
fputs(stdout,name,15);
fputs(stdout,DOB,15);
return 0;
}
int main()
{
struct data
{
char name[15];
char DOB[15];
};
HANDLE thread2;
DWORD threadID2;
thread2= CreateThread(NULL,0,Name1,(LPVOID *)data,0,&threadID2);
if(thread2==NULL)
{
cout<<"Couldn't Create Thread:("<<endl;
exit(0);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我没有把结构传递给一个线程:(如果有人帮助我,我真的很感激.
我试图改变结构的数据类型来传递它,但是,我想我不知道该怎么做.
我很难过.我正在粘贴下面的程序.
void printGrid(int n,char grid[n][n]){
for(int i = 0; i<n ; i ++) {
printf("\n%s",grid[i]);
}
}
int main() {
char grid[6][6]= {"-----","-----","-----","-----","-----"};
printGrid(5, grid);
for(int i = 0; i<5 ; i ++) {
printf("\n%s",grid[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-----
-
--
---
-----
-----
-----
-----
-----
Run Code Online (Sandbox Code Playgroud)
为什么同一个for循环在函数外部和内部产生不同的输出printGrid?
我有一个指向结构的指针数组:
item** items = NULL;
Run Code Online (Sandbox Code Playgroud)
这些是我为分配和打印数组而编写的函数:
void allocateItems(item** items, int numItems) {
items =malloc(numItems*sizeof(item*));
for (int i = 0; i < numItems; i++) {
items[i]=malloc(sizeof(item*));
items[i]->data = i + 1;
items[i]->data2 = (i + 1) % 2;
}
}
void printItems(item** items, int numItems) {
for (int i = 0; i < numItems; i++) {
printf("%d : %d\n", items[i]->data, items[i]->data2);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试打印那个结构数组时,我得到了一个分段错误.谁能告诉我错误在哪里?
c ×4
c++ ×2
winapi ×2
arrays ×1
corruption ×1
hard-drive ×1
memory ×1
messagebox ×1
mfc ×1
pointers ×1
printf ×1
struct ×1
windows ×1