关于vector中push_back char数组的问题

cjchenxi 2009-12-23 11:04:02
std::vector<std::string> m_vecDir;
char szDir[MAX_PATH] = "c:\\2323\\23232.doc";
std::string strTemp = szDir;
m_vecDir.push_back(sztt);//此句出错,为什么?

先谢谢了
...全文
990 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
forster 2009-12-23
  • 打赏
  • 举报
回复
遇到过这种问题
这句代码没问题
之前的代码如果把有关stl的堆破坏了出现过一样的问题。
dskit 2009-12-23
  • 打赏
  • 举报
回复
sztt 未定义。
taodm 2009-12-23
  • 打赏
  • 举报
回复
请贴你的真实完整代码。
herry-Li 2009-12-23
  • 打赏
  • 举报
回复
#include <iostream>
#include <iterator>
#include <string>
#include <iostream>

using namespace std;


int main() {
vector <string> m_vecDir;
char szDir[100] = "c:\\2323\\23232.doc";
string strTemp = szDir;
m_vecDir.push_back(strTemp);//此句出错,为什么?
copy(m_vecDir.begin(),m_vecDir.end(),ostream_iterator<string>(cout,","));

return 0;


} ///:

vs2008下没错啊,楼主什么环境?
cjchenxi 2009-12-23
  • 打赏
  • 举报
回复
to DLevel,taodm,kouwenlong:
如果都在同一MIAN函数里,确实没问题。
但是m_vecDir 是个类成员函数 ,所以就不知道原因了
cjchenxi 2009-12-23
  • 打赏
  • 举报
回复
vs.net 2002
DLevel 2009-12-23
  • 打赏
  • 举报
回复
int main(void)
{
vector <string> m_vecDir;
char szDir[MAX_PATH] = "c:\\2323\\23232.doc";
string strTemp = szDir;
m_vecDir.push_back(strTemp );//
cout<<m_vecDir[0];
system("PAUSE");
return 0;
}


VS 2008输出没错误
冻结 2009-12-23
  • 打赏
  • 举报
回复
_BUF_SIZE <= _Myres
这句
cjchenxi 2009-12-23
  • 打赏
  • 举报
回复
如果都在同一MIAN函数里,确实没问题。
但是m_vecDir 是个类成员函数 ,所以就不知道原因了
taodm 2009-12-23
  • 打赏
  • 举报
回复
楼主用的什么编译器?
kouwenlong 2009-12-23
  • 打赏
  • 举报
回复
#include <vector>
using namespace std;
#define MAX_PATH 100
int main()
{
std::vector <std::string> m_vecDir;
char szDir[MAX_PATH] = "c:\\2323\\23232.doc";
std::string strTemp = szDir;
m_vecDir.push_back(strTemp );//此句出错,为什么?

return 0;
}
cjchenxi 2009-12-23
  • 打赏
  • 举报
回复
还是同样的错误
中断在文件xstring
void _Tidy(bool _Built = false)
{ // initialize buffer, deallocating any storage
if (!_Built)
;
else if (_BUF_SIZE <= _Myres)
_Mybase::_Alval.deallocate(_Myptr(), _Myres + 1);
_Myres = _BUF_SIZE - 1;////中断 在这一行
_Eos(0);
}
冻结 2009-12-23
  • 打赏
  • 举报
回复

std::vector <std::string> m_vecDir;
std::string strDir("c:\\2323\\23232.doc");
m_vecDir.push_back(strDir);

这样岂不更好。
冻结 2009-12-23
  • 打赏
  • 举报
回复
不应该出错呀。
std::string strTemp(szDir);
这样试一试。
cjchenxi 2009-12-23
  • 打赏
  • 举报
回复
不好意思 是
std::vector <std::string> m_vecDir;
char szDir[MAX_PATH] = "c:\\2323\\23232.doc";
std::string strTemp = szDir;
m_vecDir.push_back(strTemp );//此句出错,为什么?

先谢谢了
冻结 2009-12-23
  • 打赏
  • 举报
回复
m_vecDir.push_back(sztt);//此句出错,为什么?
sztt这是个什么东西?
在哪儿定义的。
wuyu637 2009-12-23
  • 打赏
  • 举报
回复
sztt是啥啊
cjchenxi 2009-12-23
  • 打赏
  • 举报
回复
总结:
1。将类对象定义成为全局对象,这样静态回调函数就可以用了。而且其成员变量一直存在。
2。仍然传递局部函数对象指针,这样在PRO函数中得到的地址和传入的地址有偏差,不知道为什么?所以在使用VEVTOR时地址不对。相当于已经被析够了。理论上,对象在WINMAIN退出前是一直可以供PRO静态回调函数使用的。 原因:地址传输中被多取了一次地址。

看来很多问题表象并不能说明问题
cjchenxi 2009-12-23
  • 打赏
  • 举报
回复
有以下方案可以解决问题:
1。将类对象定义成为全局对象,这样静态回调函数就可以用了。而且其成员变量一直存在。
2。仍然传递局部函数对象指针,这样在PRO函数中得到的地址和传入的地址有偏差,不知道为什么?所以在使用VEVTOR时地址不对。相当于已经被析够了。理论上,对象在WINMAIN退出前是一直可以供PRO静态回调函数使用的。

cjchenxi 2009-12-23
  • 打赏
  • 举报
回复
全部代码:只想知道错误的原因。

//h
class MainDlg
{
public:
MainDlg(HINSTANCE hInst);
~MainDlg();
bool CreateMainDialog(HINSTANCE hInst, const HWND hWnd,LPARAM lparam);


static LRESULT CALLBACK MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void InitMainDlg(HWND hWnd);
void ShowDlg(int iTabId);
void SetApplicationPath();
bool GenerateDir();

bool GetAppName(char *szAppPath);

HWND m_hWnd;
HINSTANCE m_hInst;
HWND m_hPageWnd[6];
int m_iTabCount;
HWND m_hTab;
RECT m_rcTab;

char m_szAppPath[MAX_PATH+1];
char m_szAppName[MAX_PATH+1];
char m_szDir[MAX_PATH+1];
std::vector<std::string> m_vecMainDir;
};
//cpp
#include"stdafx.h"
#include"MainDlg.h"

char g_szTestItemDir[6][32] = {"1",
"2",
"3",
"4",
"5",
"6"};

MainDlg::MainDlg(HINSTANCE hInst)
{
this->m_hInst = hInst;
}

MainDlg::~MainDlg()
{
m_hInst = NULL;
}

bool MainDlg::CreateMainDialog(HINSTANCE hInst, const HWND hWnd,LPARAM lparam)
{
INT_PTR iRet;
iRet = DialogBoxParam(m_hInst,MAKEINTRESOURCE(IDD_MAIN),hWnd,(DLGPROC)MainDlg::MainProc,(LPARAM)&lparam);

DWORD DError = GetLastError();

if(iRet == 0 || iRet == -1)
return false;
else
return true;
}

void MainDlg::InitMainDlg(HWND hWnd)
{
//initial value
m_hWnd = hWnd;
m_iTabCount = 6;
ZeroMemory(m_szDir, MAX_PATH+1);
strcpy(m_szDir, "C:\\tt");

ZeroMemory(m_szAppName, MAX_PATH+1);
//end init

m_hTab = ::GetDlgItem(m_hWnd,IDC_TAB);

for( int i = 0; i < m_iTabCount; i++)
{
TCITEM item;
item.mask = TCIF_TEXT;
item.cchTextMax = strlen(g_szTestItemDir[i]);
item.pszText = g_szTestItemDir[i];

TabCtrl_InsertItem(m_hTab,i,&item);
}



GetClientRect(m_hTab, &m_rcTab);
m_rcTab.top+=20;
//m_rcTab.left+=1;
m_rcTab.right-=1;
m_rcTab.bottom-=1;

MoveWindow(m_hPageWnd[0],m_rcTab.left,m_rcTab.top,m_rcTab.right-m_rcTab.left,m_rcTab.bottom-m_rcTab.top,TRUE);
ShowWindow(m_hPageWnd[0],TRUE);

for(int i = 1;i < m_iTabCount; i++)
ShowWindow(m_hPageWnd[i],FALSE);
}

void MainDlg::ShowDlg(int iTabId)
{
MoveWindow(m_hPageWnd[iTabId],m_rcTab.left,m_rcTab.top,m_rcTab.right-m_rcTab.left,m_rcTab.bottom-m_rcTab.top,TRUE);

for(int i = 0;i < m_iTabCount; i++)
{
if(i == iTabId)
ShowWindow(m_hPageWnd[i],TRUE);
else
ShowWindow(m_hPageWnd[i],FALSE);
}
}

void MainDlg::SetApplicationPath()
{
ZeroMemory(m_szAppPath, MAX_PATH+1);

OPENFILENAME ofn;
ZeroMemory(&ofn , sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.Flags = OFN_EXPLORER;
ofn.hInstance = NULL;
ofn.hwndOwner = m_hWnd;
ofn.lpstrTitle = "Select the Application";
ofn.lpstrFilter = "*.exe\0*.exe\0\0";
ofn.lpstrInitialDir = "c:\\";
ofn.lpstrFile = m_szAppPath;
ofn.nMaxFile = MAX_PATH;

if(GetOpenFileName(&ofn))
{
SetDlgItemText(m_hWnd,IDC_APPPATH,m_szAppPath);

if(!GetAppName(m_szAppPath))
MessageBox(m_hWnd,"Please Input Application Path that includes \".exe\"!","Warning",MB_OK);
}
}

bool MainDlg::GetAppName(char *szAppPath)
{
ZeroMemory(m_szAppName, MAX_PATH+1);

if(szAppPath == NULL || strlen(szAppPath) == 0)
return false;

if(strlen(szAppPath) > 0)
{
char *szBuf = NULL, *szExeStartPos = NULL;
szBuf = strrchr(szAppPath,'\\')+1;
szExeStartPos = szAppPath + strlen(szAppPath) - 4;//Get ".exe"

if(_strnicmp(szExeStartPos,".exe",4))//lowercase and uppercase is ok
return false;

if(szBuf != NULL)
{
strncpy(m_szAppName, szBuf, strlen(szBuf) - 4);
return true;
}
else
return false;
}
else
return false;

}

bool MainDlg::GenerateDir()
{
if(strlen(m_szAppName) == 0)
return false;

char szProjectDir[MAX_PATH+1];
memset(szProjectDir, 0 , MAX_PATH+1);

bool bRetCreateDir = false;

//Generate test project folder
COleDateTime cdt(COleDateTime::GetCurrentTime());
strcpy(szProjectDir, m_szDir);
strcat(szProjectDir,"\\");
strcat(szProjectDir,m_szAppName);
strcat(szProjectDir,cdt.Format("_%Y-%m-%d-%H-%M-%S"));
bRetCreateDir = CreateDirectory(szProjectDir, NULL);

if(bRetCreateDir == 0)
{
MessageBox(m_hWnd,"Can't Create a test project folder!","Warning",MB_OK);
return false;
}

//Generate test item folder and log folder
char szTestItemDir[MAX_PATH+1];
if(m_vecMainDir.size() > 0)
m_vecMainDir.clear();

for(int i = 0;i < 6; i++)
{
memset(szTestItemDir, 0 , MAX_PATH+1);

strcpy(szTestItemDir, szProjectDir);
strcat(szTestItemDir,"\\");
strcat(szTestItemDir,g_szTestItemDir[i]);
strcat(szTestItemDir,"\0");

bRetCreateDir = CreateDirectory(szTestItemDir, NULL);
if(bRetCreateDir == 0)
{
MessageBox(m_hWnd,"Can't Create a test item folder!","Warning",MB_OK);
RemoveDirectory(szProjectDir);
return false;
}

std::string strTemp = szTestItemDir;
m_vecMainDir.push_back(strTemp); //error

strcat(szTestItemDir,"\\log");

bRetCreateDir = CreateDirectory(szTestItemDir, NULL);
if(bRetCreateDir == 0)
{
MessageBox(m_hWnd,"Can't Create a test log folder!","Warning",MB_OK);
RemoveDirectory(szProjectDir);
return false;
}
}

return true;

}

LRESULT CALLBACK MainDlg::MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static MainDlg *dlgPtr;

switch (uMsg)
{
case WM_INITDIALOG:
{
dlgPtr = (MainDlg*)lParam;
dlgPtr->InitMainDlg(hWnd);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BROWSEPATH:
dlgPtr->SetApplicationPath();
break;
case IDC_GENERATESCRIPT:
dlgPtr->GenerateDir();
break;
}
break;
case WM_NOTIFY: //Tab Control WM_NOTIFY
if (((LPNMHDR)lParam)->code == TCN_SELCHANGE )//Tab Contro TCN_SELCHANGE /TCN_SELCHANGING
{
int i = (int)SendDlgItemMessage(hWnd,IDC_TAB,TCM_GETCURSEL,0,0);
dlgPtr->ShowDlg(i);
}
break;
case WM_CLOSE:
{
EndDialog(hWnd, wParam);
dlgPtr->m_hWnd = NULL;
return TRUE;
}
break;
}

return FALSE;
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hDeskTopWnd = GetDesktopWindow();

INITCOMMONCONTROLSEX iccx;
iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccx.dwICC = ICC_ANIMATE_CLASS | ICC_BAR_CLASSES | ICC_HOTKEY_CLASS | ICC_LISTVIEW_CLASSES | \
ICC_PROGRESS_CLASS | ICC_TAB_CLASSES | ICC_TREEVIEW_CLASSES | ICC_UPDOWN_CLASS | \
ICC_USEREX_CLASSES | ICC_PAGESCROLLER_CLASS ;
InitCommonControlsEx (&iccx);

MainDlg mainDlg(hInstance);
mainDlg.CreateMainDialog(hInstance, hDeskTopWnd, (LPARAM)&mainDlg);

return 0;
}

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧