iT邦幫忙

0

關於 VS C/C++ 的幾個問題

  • 分享至 

  • xImage

最近在自學程式語言, 使用VS2019遇到了幾個問題想請各位大大幫忙解答

  1. C 有沒有比較正規做多 THREAD 的函式, 在VS上 pthread.h 要另外裝, 用x64的電腦還需要再下載其他DLL檔, 這樣不直覺的作法是不是C有其他自己的函式庫或我搞錯什麼了?
  2. C 取得系統時間目前查到使用下面這種作法, 有沒有更有效率的方法能取到精準到微秒
struct _timeb timebuffer;
_ftime_s(&timebuffer);
    
char timeline[26];
ctime_s(timeline, 26, &(timebuffer.time));
printf("The time is %.19s.%hu %s", timeline, timebuffer.millitm,&timeline[20]);
  1. _wfindfirst 的用法, 以下是我的 code, 只要 cFList(char* _a)執行完 _wfindfirst(buff, &file))且成功, 我帶入的 _a 位址就會消失(若傳址, 傳多個參數到cFList()位址也都會消失), 但若是使用_findfirst()就很正常, 可是因為我需要開簡體字檔案所以需要特別使用 wchar_t 型態去編碼所以還是需要用 _wfindfirst
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <windows.h>

void cFList(char* _a) {
    struct _finddata_t file;
    intptr_t hFile=0;

    wchar_t dirPath[512] = { 0 };
    wchar_t buff[200] = L"D:\\*.*";

    if ((hFile = _wfindfirst(buff, &file)) == -1)
    {
        perror("path error"), exit(1);
    }
}

int main(int argc, char const* argv[]) {
    
    wchar_t dirPath1[200] = L"D:\\";
    wchar_t extenName1[200] = L"*.*";

    char a[100] = "D:\\";
    cFList(a);
     
    return 0;
}

麻煩知道的高手解答一下, 謝謝

EN iT邦好手 1 級 ‧ 2021-08-16 12:57:28 檢舉
回第一點: 使用 pthread 是正常的。
然後問題的程式碼沒有貼好,建議你可以修一下 Markdown~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-08 10:40:57
  1. C 有沒有比較正規做多 THREAD 的函式, 在VS上 pthread.h 要另外裝, 用x64的電腦還需要再下載其他DLL檔, 這樣不直覺的作法是不是C有其他自己的函式庫或我搞錯什麼了?

C 沒有提供管理多執行緒的函式,通常會使用第三方函式庫(例如 pthread)或作業系統 API 實作多執行緒操作。pthread 是一個常用且跨平台的多執行緒函式庫,需要另外安裝,但它提供一個統一的介面來管理多執行緒。在 Visual Studio 中使用 pthread 可能需要額外下載 DLL,但透過使用第三方函式庫來管理多執行緒是一種通用的方法。

  1. C 取得系統時間目前查到使用下面這種作法, 有沒有更有效率的方法能取到精準到微秒

您提到的程式碼使用 _ftime_s 函式來取得系統時間,但精確度僅到毫秒。如果需要精確到微秒,可以使用其他函式,例如:

  • clock_gettime:可以通過 <time.h><sys/time.h> 兩個函式庫來呼叫,精確度更高,可以達到 nanoseconds。
  • QueryPerformanceCounter:是 Windows 函式庫,可以通過 <Windows.h> 函式庫來呼叫,精確度更高,可以達到 nanoseconds。
  1. _wfindfirst 的用法, 以下是我的 code, 只要 cFList(char* _a)執行完 _wfindfirst(buff, &file))且成功, 我帶入的 _a 位址就會消失(若傳址, 傳多個參數到cFList()位址也都會消失), 但若是使用_findfirst()就很正常, 可是因為我需要開簡體字檔案所以需要特別使用 wchar_t 型態去編碼所以還是需要用 _wfindfirst

這是因為_wfindfirst會改變傳遞給它的參數的值,導致這個參數的位址上的內容消失。在本例中,你傳遞的是char類型的參數,但_wfindfirst需要的是wchar_t類型的參數。解決這個問題的方法是將傳遞給cFList的參數轉換為wchar_t類型,並在cFList函數內替換_wfindfirst和_findfirst。

void cFList(wchar_t* _a) 
{
    struct _wfinddata_t file;
    intptr_t hFile=0;
    wchar_t buff[200];
    wcscpy_s(buff, 200, _a);
    wcscat_s(buff, 200, L"\\*.*");

    if ((hFile = _wfindfirst(buff, &file)) == -1)
    {
        perror("path error"), exit(1);
    }
}

int main(int argc, char const* argv[]) 
{
    wchar_t dirPath1[200] = L"D:\\";
    wchar_t extenName1[200] = L"*.*";

    wchar_t a[100] = L"D:\\";
    cFList(a);

    return 0;
}

我要發表回答

立即登入回答