我用VC++6.0写了代码一调试总是说fp未声明标识符和没有匹配if的非法else。请哪位大侠指教一下,谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用VC++6.0写了代码一调试总是说fp未声明标识符和没有匹配if的非法else。请哪位大侠指教一下,谢谢!相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <tchar.h>
struct time

int hour;
int minute;
int second;
t;
int main()

FILE* fpFILE;
fp=fopen_s(&fpFILE,"Time","r");
fread(&t,sizeof(struct time),1,fp);
rewind(fp);
fread(&t,sizeof(struct time),1,fp);
if (t.second == 59)

t.minute = t.minute + 1;
if (t.minute ==60)

t.hour = t.hour + 1;
t.minute =0;
t.second =0;
else t.second =t.second +1;
printf("%d:%d:%d\n",t.hour,t.minute,t.second);
fp=fopen_s(&fpFILE,"Time","w");
fwrite(&t,sizeof(struct time),1,fp);
fclose(fp);

return 0;

参考技术A FILE* fpFILE; 后面的fp FILE去掉吧

fp=fopen_s(&fpFILE,"Time","r");追问

我试了您的方法但是VC++6.0说 error C2440: “=”: 无法从“errno_t”转换为“FILE *” error C2181: 没有匹配 if 的非法 else。不知道又是哪里出问题了,麻烦您在指点一下,谢谢!

追答

你的fopen_s这个函数从哪里来的

追问

我原本是写fopen的,结果编程软件说不接受3个函数。结果,就改成了fopen_s。

追答

fp = fopen("Time", "r");

追问

我改后又是这个结果:

麻烦您在指点一下,谢谢!

追答其实VC6里有fopen_s这个函数吗,没听过, 它那个警告应该是说fopen非线程安全,不用管它#include &lt;stdio.h&gt;
#include &lt;tchar.h&gt;
struct time
int hour;
int minute;
int second;
t;
int main()

FILE* fp = NULL;
fp = fopen("Time", "r");
fread(&amp;t, sizeof(struct time), 1, fp);
rewind (fp);
fread(&amp;t, sizeof(struct time), 1, fp);
if (t.second == 59)
t.minute = t.minute + 1;
if (t.minute == 60)
t.hour = t.hour + 1;
t.minute = 0;
t.second = 0;

else
t.second = t.second +1;

printf("%d:%d:%d\\n", t.hour, t.minute, t.second);
fclose(fp); //之前已经打开,要先关闭
fp = fopen("Time", "w");
fwrite(&amp;t, sizeof(struct time), 1, fp);

fclose(fp);
return 0;

本回答被提问者采纳

[转]内存分配malloc, new , heapalloc

这里比较的VC++编译的C++代码中的性能

我用的是VC6.0测试的

就不介绍这几个的用法了

我写了一段简单的测试代码

测试结果是:

malloc:390
new:391
VirtualAlloc:454
HeapAlloc:47

很明显的是HeapAlloc分配速度最快,malloc次之,new和malloc差不多,VirtualAlloc最慢了(以前小强跟我说这个最快)

我有跟踪了一下

new调用了这段代码

  1. void * __cdecl _nh_malloc (
  2.         size_t nSize,
  3.         int nhFlag
  4.          )
  5. {
  6.         return _nh_malloc_dbg(nSize, nhFlag, _NORMAL_BLOCK, NULL, 0);
  7. }

malloc函数是这样的:

  1. _CRTIMP void * __cdecl malloc (
  2.         size_t nSize
  3.          )
  4. {
  5.         return _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);
  6. }
  7.  

很明显,new和malloc最终调用相同的_nh_malloc_dbg,只是new多了一次函数调用

再继续跟下去,发现最终调用的是return HeapAlloc(_crtheap, 0, size);

基本上真相大白了

VirtualAlloc跟踪不进去,如果说分配的是虚拟内存的话,有可能会慢吧。

回头再认真看看《Windows核心编程》这本书!

欢迎指正!欢迎交流!

测试代码如下:

  1. /******************************************************************
  2. *
  3. * Copyright (c) 2008, xxxx
  4. * All rights reserved.
  5. *
  6. * 文件名称:main.cpp
  7. * 摘    要: 测试申请内存的速度
  8. *
  9. * 当前版本:1.0
  10. * 作     者:吴会然
  11. * 完成日期:2008-11-30
  12. *
  13. * 取代版本:
  14. * 原   作者:
  15. * 完成日期:
  16. *
  17. ******************************************************************/
  18.  
  19. #include <iostream>
  20. #include <windows.h>
  21. using namespace std;
  22.  
  23. int main( int argc, char *argv[] )
  24. {
  25.     int i = 0;
  26.     DWORD dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0;
  27.     DWORD dwStart = 0;
  28.     DWORD dwEnd = 0;
  29.     forint j = 0; j < 10; j++ )
  30.      {
  31.          dwStart = ::GetTickCount();
  32.         for( i = 0; i < 20000; i++ )
  33.          {
  34.             char *pDest1 = (char *)malloc(4096);
  35.              free( pDest1 );
  36.     
  37.          }
  38.          dwEnd = ::GetTickCount();
  39.          cout << "malloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
  40.          dw1 += dwEnd - dwStart;
  41.  
  42.          dwStart = ::GetTickCount();
  43.         for( i = 0; i < 20000; i++ )
  44.          {
  45.             char *pDest2 = new char[4096];
  46.             delete pDest2;
  47.     
  48.          }
  49.          dwEnd = ::GetTickCount();
  50.          cout << "new 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
  51.          dw2 += dwEnd - dwStart;
  52.  
  53.          dwStart = ::GetTickCount();
  54.         for( i = 0; i < 20000; i++ )
  55.          {
  56.             void* pMem = ::VirtualAlloc(NULL, 4096,   MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
  57.              ::VirtualFree(pMem, 0, MEM_RELEASE);
  58.          }
  59.          dwEnd = ::GetTickCount();
  60.          cout << "VirtualAlloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
  61.          dw3 += dwEnd - dwStart;
  62.  
  63.         HANDLE hHeap = ::HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
  64.          dwStart = ::GetTickCount();
  65.         for( i = 0; i < 20000; i++ )
  66.          {
  67.             void* pMem2 = ::HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 4096 );
  68.              ::HeapFree(hHeap, HEAP_NO_SERIALIZE, pMem2);
  69.  
  70.          }
  71.          dwEnd = ::GetTickCount();
  72.          cout << "HeapAlloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
  73.          dw4 += dwEnd - dwStart;
  74.  
  75.      }
  76.  
  77.      cout << "malloc:" << dw1 << endl;
  78.      cout << "new:" << dw2 << endl;   
  79.      cout << "VirtualAlloc:" << dw3 << endl;   
  80.      cout << "HeapAlloc:" << dw4

 

 

 

====================================

转】李玮剑 评论
1 把分配的内存空间改为4M甚至更高(循环次数减少)试试,结果截然不同。处理M级的大文件时,用VirtualAlloc效率高

2 博主的测试需要考究,系统在创建线程时就已经预先在线程的堆栈段中提交了两个页面。 按照我的观点new和malloc只要消耗的内存没有超过页面大小就不会实际的进行存储器的保留与提交。二者的操作不在一个层面上。

3 在分配大于一个页面数据的时候 virtualAlloc才有意义

4 virtualAlloc是操作系统提供的最根本的内存分配接口。HeapAlloc预先使用virtualAlloc申请了大块的内存,并根据优化算法组织了用于内存管理的数据结构,主要是对小内存分配的优化 new和malloc是语言层面接口,由于HeapAlloc已经有了优化,所以vc中的malloc并没有使用更多的优化算法,直接转入 HeapAlloc。

 

内存管理有三种方式:

https://blog.csdn.net/zj510/article/details/39400087

1. 虚拟内存,VirtualAlloc之类的函数

2. 堆,Heapxxx函数,malloc,new等

3. 内存映射文件,Memory Mapped File

很多人都会困惑,但是看下面的图片就会比较明白了。这个图片从MSDN上拷来。

技术分享图片

堆和虚拟内存,从上面的图片就可以看出,其实所谓的堆,也就是在虚拟内存上抽象出来的。如果直接用Virtualxxx系列函数,是有一些限制的,比如每次只能分配页大小倍数的内存,内存地址也必须对齐什么的。新手很难用。正因为如此,才出现了堆。实际上堆Heap内部就是使用Virtual系列函数的。基本思想就是:先用VirtualAlloc分配一个比较大的内存,然后用户每次申请堆内存的时候,从分配出来的虚拟内存块上指定一块给用户。比如第一次分配堆内存从A地址开始的100个字节,第二次分配的时候就是A+100开始。

Memory Mapped File就不太一样了,从上面的图可以看出MMF并没有调用Virtual系列函数。它直接调用内核层了。

对于malloc和new,这2个并不是操作系统API,它们是语言提供的函数。在不同的系统上面有不同的实现方法,在Windows上面,new调用malloc,malloc调用堆函数(heapxxx),堆函数调用Virtual系列函数。在Linux上面就调用相应的linux API.

以上是关于我用VC++6.0写了代码一调试总是说fp未声明标识符和没有匹配if的非法else。请哪位大侠指教一下,谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

VC++6.0中如何用Debug进行程序调试?

keil c51 对齐快捷键?写了很多c代码,有没有快捷键可以把所有对齐,VC++6.0就有这样的快捷键。

用Opencv1.0+VC++6.0怎样打开.mp4格式的视频?

vc++6.0怎么编译多个C文件

在VC++6.0中,总是出现一个叫error spawning c1.exe的错误,怎么回事呢?

C/C++编程笔记:VC++6.0环境下调试 C语言 代码的方法和步骤