[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 08/27 18:32 / Filesize : 189 KB / Number-of Response : 742
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.37【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 15:29:45 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.36【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1175436073/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


652 名前:デフォルトの名無しさん [2007/05/27(日) 06:14:21 ]
/*----------------------------
メモリの確保
----------------------------*/
if ( (im = (int**)malloc(sizeof(int*) * (*ph))) == NULL ) {

printf("メモリが確保できません。\n");
return (NULL);

for ( j=0; j< *ph; j++){

if( (im[j] = (int*)malloc( sizeof(int) * (*pw) )) ==NULL ){

printf("メモリを確保できません。\n");
return(NULL);

}

}

}


printf("メモリ領域が確保できました。\n");




653 名前:デフォルトの名無しさん [2007/05/27(日) 06:15:21 ]
/*-----------------------------
画像データの読み込み
-----------------------------*/

for ( j=0; j< *ph; j++ ){
for ( i=0; i< *pw; i++ ){

if ( fscanf(fp,"%d", &temp) != 1 ){

printf("画像データの取得に失敗しました。\n");
return(NULL);

}

im[j][i] = temp;

}
}

return (im);

}


654 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 08:28:39 ]
>>649
・長いソースはアップローダを使ってくれ。
・その画像ファイルにはコメントは含まれていないか?
試しにエディタで開いてみて、コメントがあるようなら削って味噌。
・そもそもなんでlibpgmでも使わないんだ?

>>648
>647でも指摘されているが、CPU側の事情で巧く動かないだけ。
(x86)アセンブラの勉強をすれば容易に解決する問題。

655 名前:644 mailto:sage [2007/05/27(日) 11:15:59 ]
>>654
了解です。
「はじめての」シリーズがアマゾンで評価高かったので見てみようかと思います。
あとは、インラインアセンブラで関数作ってその部分だけバイナリで吐き出させて
再び埋め込んでみるのもいいかもしれないです。
シェルコードの解説サイトにソースがあったので使えそうです。
スレ違いな感じですがいろいろ有難うございます。

656 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 12:40:27 ]
>>649
おそらくポインタ関係でミスってる、てことは分かるでしょ?
>>652 で im != NULL のときどうなるか考えてみ。


657 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 17:46:45 ]
>>644
EAX の上位ビットをクリアすればいけるかも

658 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:09:00 ]
>>644のは ret のC3がeaxレジスタにmovするときの数値で食われてるから
返ってこないんだよ。

659 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:24:25 ]
>>644
IMMが32bitの場合と16bitの場合を区別するために、
mov ax, 0x123
では、0x66, 0xb8, 0x23, 0x01
とプリフィックスを入れる必要があるみたい。

660 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:29:14 ]
まぁ厳密には関数ポインタは他のポインタと互換性があるとは限らないんだけど



661 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:34:14 ]
確かに…
リニアアドレスであればいいかもしれないが、
データセグメントとコードセグメントなんかに分かれてると
普通に呼び出すのは無理そう

OSのセキュリティレベルが上がってくると
またDOSのようにセグメント毎に分かれるかもしれんし

662 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:45:59 ]
>>660
>>661
こういうことをやる場合は16bit/32bit/64bitで分けるのは当然。
逆にそれを分けてしまえば、ポインタのサイズも
セグメントの問題もどうにでもなると思うけど…

663 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 18:47:20 ]
16bit/32bit/64bitで分けるっていうのは、
CPUの種類の話ね^^

664 名前:649 [2007/05/28(月) 09:22:00 ]
みなさん、ありがとうございます。
無事に動かすことができました。


665 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 10:42:28 ]
クラスのコピーコンストラクタとoperator=って、
実装する処理がまったく同じになることが多いんですけど、
メンバのコピー自体はoperator=だけに書いて、

AAAA::AAAA(const AAAA& rSrc)
{
*this = rSrc;
}

とか書いて処理を合体してしまうことって
やっぱり好ましくないことですか?

666 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 10:55:56 ]
>>665
代入と初期化は異なる演算です。
コピーコンストラクタでは初期化リストで各メンバのコピーコンストラクタを使いましょう。

667 名前:デフォルトの名無しさん mailto:age [2007/05/28(月) 11:33:02 ]
結果:Strike!

char *pszMsg = "Lucky Strike!";
char *pszHit;
[ 問 ];
printf("%s\n,pszHit");

668 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 11:37:50 ]
最後の"はそこでいいのか

669 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 01:31:34 ]
VisualStudio2005でC++をコンパイルした実行ファイルをリバースエンジニアリングできますか?

670 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 01:37:08 ]
はい、できます。



671 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 01:47:07 ]
>>669
君には、できません><

672 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 03:10:42 ]
CLRヘッダが無いと怒られてしまいました。
どうすれば、リバースエンジニアリングできますか?

673 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 03:16:27 ]
リバースエンジニアになればリバースエンジニアリングできます!

674 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 03:20:04 ]
馬鹿にはできない不思議なリバースエンジニアリング

675 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 19:35:08 ]
逆アセンブラはできるけど、逆コンパイルはできない。

676 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 19:49:18 ]
× 逆アセンブラ
○ 逆アセンブル

× できない
○ それ的な事はできるけど、元のソースを再現できるわけではない

677 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:07:41 ]
ブーメラン ブーメラン

678 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:13:09 ]
64ビットになったらアセンブラでプログラムなんて無理だよね

679 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:13:48 ]
>>678
なんでやねん?

680 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:14:36 ]
めんどくさくない?



681 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:15:00 ]
>>678
ドラスティックな変化があると思っているなら、不勉強にも程がある。

682 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:26:26 ]
eax とかが rax とかになるだけだろ。

683 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:30:51 ]
歳も歳だし、新しく勉強なんてもう俺には無理だよorz
16ビットが恋しい

684 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 21:14:53 ]
逆アセでollydbg使ってる奴はいないのか?

685 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 21:49:24 ]
なんだよ

686 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 22:59:51 ]
16ビットなら人間の手足で数えられるんだな

687 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 23:39:43 ]
つーか16ビットの方がめんどうだっだろ

688 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 23:42:06 ]
だっだろ

689 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 08:45:31 ]
だっだろだっだろ

690 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 10:24:56 ]
リスクは面倒だっだ



691 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 12:59:59 ]
フリスクはよかった

692 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 13:12:08 ]
ロリスクってなんですか?ハァハァ

693 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 13:24:56 ]
ローリスクっぽい言葉の響きなのに凄くハイリスクな感じがするな。

694 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 13:27:09 ]
>>693
っ ■■■(座布団)

695 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:02:25 ]
なんら意味のないプログラム

void add(int)
int main(void){
add(2);
return 0;
}

void add(int x){
x=x+1;
}

これ、main関数の中のadd(2)が実行された時点で、
内部だとx==2なので2=2+1になってエラーが起こると思うんだけどおこらない。

main関数の中に
2=2+1;
ってやったらエラーが出て実行できない。

これはなぜ?教えてください

696 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:06:43 ]
>>695
関数へはコピー渡しだからaddを呼んだ時点で2が変数xにコピーされている。
void add(int& x) だとコンパイルエラーにならないか?

697 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:06:58 ]
意味がないなら、どうでもいいじゃないか。( ´∀`)

>内部だとx==2なので2=2+1になってエラーが起こると思うんだけどおこらない。
C/C++ では、引数は値渡しなので
add() 内部で x という変数が 2 になっているだけ。
add() を抜けると、+1 したはずの x は消滅。

698 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:08:10 ]
おいおいw

699 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:09:56 ]
↑誤爆スマソ

700 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:11:53 ]
↓自爆スマソ



701 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 15:12:26 ]
>>695
そのx=x+1;での=は、数学の授業でやるような等しいという状態を表しているものではなく、
「代入しろ」という動作の命令なのよ。

代入しろという命令だから=の左には代入できるものを書かないとエラー。
だからx=x+1;はokで2=2+1;はエラーになる。

702 名前:デフォルトの名無しさん mailto:age [2007/05/30(水) 22:14:02 ]
CかC++で、整数型のユニークなIDを作るような機能を持ったライブラリってありませんか?

703 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 22:27:11 ]
>>702
uuid

704 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 22:32:30 ]
用途が分からんと何とも言えない気がする。

705 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 23:14:46 ]
unsigned long GenerateUniqueID()
{
static unsigned long id=0;
id++;
return id;
}

706 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 23:47:21 ]
スレッドセーフじゃないな。

707 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 23:51:39 ]
unsigned long GenerateUniqueID()
{
static unsigned long id=0;
static int locked=0;

while(locked) msleep(1);
locked=1;
id++;
locked=0;
return id;
}

ミューテックス使わなきゃ駄目?

708 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:06:39 ]
当然なんらかの同期化機構を利用しないとダメ。
スレッドAがwhile(locked)で
"lockedの値をレジスタに取った直後に" スレッドが切り替わり
スレッドBが同様にwhile(locked)を実行したらどうなる?

あと、そのコードはstatic変数の初期化も下手すると二回以上行われるね。

709 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:08:51 ]
いや、、、初期化は実行時じゃ無いぞ・・・
クリティカルセクションでいいな

710 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:17:29 ]
ごめん。C++のつもりで書いてたわ…。



711 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:42:27 ]
最適化でゴッソリ消える予感

712 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:50:34 ]
synchronized

713 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 02:12:57 ]
C++ にあればねえ

714 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 02:16:48 ]
>>711
その点については volatile つけとけばおk

715 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 06:43:11 ]
そういう問題じゃないけどまぁいいか。

716 名前:デフォルトの名無しさん [2007/05/31(木) 08:42:34 ]
すいません、この関数って何か間違ってますか?
hairetsu2は、メモリ領域が確保してあり、srand()も関数の外で処理しています。
hairetsu2[j][i] = rand()%2のところで止まります。お願いします。
void rand_point( int **hairetsu2, int row, int line ){

int i, j;

/*** 2次配列の0or1をランダムに格納する ***/
for (j=0; j<row; j++){
for (i=0; i<(1+line); i++){

hairetsu2[j][i] = (rand()%2);

}
}

printf("2次配列にランダムに0or1を格納できました。\n");

}

717 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:06:05 ]
>hairetsu2は、メモリ領域が確保してあり、
どうせちゃんと確保してないに決まってる

718 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:06:36 ]
「止まります」?そもそもコンパイル通らんだろ。

719 名前:デフォルトの名無しさん [2007/05/31(木) 09:25:24 ]
コンパイルは通るんですよ↓メモリ確保は、次の関数で確保してます。
void securement2( int **hairetsu2 , int row , int line ){

int i, j;
/*** 2次配列の行を確保する ***/
if (( hairetsu2 = (int **)malloc( sizeof( int* ) * row )) == NULL ){
printf("2次配列のメモリ領域が確保できません。\n");
exit (1);
}
/*** 各行に得点の列を確保する ***/
for ( j=0; j<(row); j++){
if (( hairetsu2[j] = (int*)malloc( sizeof(int) * (1+line) )) == NULL ){
printf("2次配列のメモリ領域が確保できません。\n");
exit (1);
}

/*** 2次配列を0で初期化 ***/
for (j=0; j<row; j++){
for (i=0; i<(1+line); i++){
hairetsu2[j][i] = 0;
}
}
printf("2次配列のメモリ領域が確保できました。\n");
}


720 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:30:00 ]
>>718
根拠は?

>>717
同意。

>>716
その構造だと、メモリはとint配列[line + 1]をrow回とポインタ配列[row]だけ確保する必要があるわけだが。
その部分のコードを晒して味噌。



721 名前:デフォルトの名無しさん [2007/05/31(木) 09:30:21 ]
hairetsu2[0][0]だけが格納されて止まるみたいです。hairetsu2[1][1]も格納できないみたいです。


722 名前:720 mailto:sage [2007/05/31(木) 09:32:01 ]
>>719
あーすまん、やってたのね。
で、止まるってのは具体的にどうなると?

723 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:32:23 ]
>>719
確かにメモリ確保はできてるようだけど、
hairetsu2 をそのまま使うことは出来ない。
変数 hairetsu2 は関数 securement2 を終えた時点で使用不能

724 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:33:06 ]
void securement2( int **hairetsu2 , int row , int line ){

void securement2( int ***hairetsu2 , int row , int line ){

または

void securement2( int **hairetsu2 , int row , int line ){

int **securement2( int row , int line ){
int **hairetsu2;

printf("2次配列のメモリ領域が確保できました。\n");

printf("2次配列のメモリ領域が確保できました。\n");
return hairetsu2;

725 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:44:15 ]
2次元配列も連続した領域である必要があるんだよ。
その配列のアクセスの仕方をやめるか、メモリ確保を一回でやるかどっちかにせい

726 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:45:30 ]
>>725
ちょ…おまw

727 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 10:29:04 ]
素朴な疑問だが、>>719みたいな奴って「2次元配列」言うの?
確かに同じ形で操作出来た気はするが。

>>725
何に対するレスか非常に疑問。

728 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 10:36:01 ]
可変長二次元ぬるぽ( ´∀`)

729 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 11:31:48 ]
>>727
配列のポインタの配列。

730 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 11:47:39 ]
ttp://www.kouno.jp/home/c_faq/c6.html



731 名前:デフォルトの名無しさん [2007/05/31(木) 12:37:24 ]
windows98で
SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
は実行できますか?
実行するとどうなりますか?

732 名前:649 [2007/05/31(木) 13:10:14 ]
716です。ありがとうございます。ちょっと試してみます。


733 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 13:37:36 ]
>>731
MSDN読め

734 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 15:43:09 ]
>>716はダブルポインタ理解してるか?
引数にint **hairetsu2って書いてあるが、ここでダブルポインタにする必要はなにもない。
引数をダブルポインタにするには、関数内でメモリを確保して返すような場合だけだ。
ダブルポインタ=二次元配列じゃないぞ。配列は何次元になってもメモリ内の表現は連続だ。

あとrowとlineは普通どっちも行を意味する。
rowを行とするなら、列の変数名はcolumnの方がいい。

735 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:38:07 ]
>>707
Windows APIのInterlockedIncrementのような関数が使えれば、それを使うのが楽

736 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:52:17 ]
ダブルポインタってなに?

737 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:58:01 ]
1点決めると2点分になる人

738 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:58:22 ]
配列の連続性だけど、
a[3][3] で a[0][2] と a[1][0] の連続性って規格で保証されてたっけ?

739 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 18:00:11 ]
int**がダブルポインタならこれは何ポインタ?
int*************** nullpo;

740 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 18:07:56 ]
pentadecuple



741 名前:デフォルトの名無しさん [2007/05/31(木) 18:47:40 ]
>>733
読みました。2000以降と書いてありますが、98でどうなるかは書いていません。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<189KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef