Array Dynamic resize in heap Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?O(lg n) algorithm for a fibonacci number with c++ templateNecklace counting problem-with consecutive prime constraintCounting words, letters, average word length, and letter frequencyC++ object poolUse of containers for storing StudentsC# to C++ function call that fills and auto resize array if size is not enoughGeneric Template implementation of merge sort in C++Binary searching the turning point of a functionSymbolic algebra using a generic smart pointer classC++11 min-heap with configurable arity
Is a self contained air-bullet cartridge feasible?
Retract an already submitted Recommendation Letter (written for an undergrad student)
Coin Game with infinite paradox
Why do people think Winterfell crypts is the safest place for women, children and old people?
Did war bonds have better investment alternatives during WWII?
Is it accepted to use working hours to read general interest books?
In search of the origins of term censor, I hit a dead end stuck with the greek term, to censor, λογοκρίνω
Why did Europeans not widely domesticate foxes?
Where to find documentation for `whois` command options?
What is ls Largest Number Formed by only moving two sticks in 508?
How long can a nation maintain a technological edge over the rest of the world?
false 'Security alert' from Google - every login generates mails from 'no-reply@accounts.google.com'
Stretch a Tikz tree
Will I lose my paid in full property
How to translate "red flag" into Spanish?
What is the ongoing value of the Kanban board to the developers as opposed to management
What were wait-states, and why was it only an issue for PCs?
Why isn't everyone flabbergasted about Bran's "gift"?
What is the definining line between a helicopter and a drone a person can ride in?
What's called a person who works as someone who puts products on shelves in stores?
Writing a T-SQL stored procedure to receive 4 numbers and insert them into a table
What is /etc/mtab in Linux?
When does Bran Stark remember Jamie pushing him?
Processing ADC conversion result: DMA vs Processor Registers
Array Dynamic resize in heap
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?O(lg n) algorithm for a fibonacci number with c++ templateNecklace counting problem-with consecutive prime constraintCounting words, letters, average word length, and letter frequencyC++ object poolUse of containers for storing StudentsC# to C++ function call that fills and auto resize array if size is not enoughGeneric Template implementation of merge sort in C++Binary searching the turning point of a functionSymbolic algebra using a generic smart pointer classC++11 min-heap with configurable arity
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
$begingroup$
I have answered a Question in Stackoverflow link.
a) Create a function called resize that can be used to increase the
size of integer arrays dynamically. The function takes three
parameters. The first parameter is the original array, the second
parameter is the size of this array, and the third parameter is the
size of the larger array to be created by this function. Make sure
that you allocate memory from the heap inside this function. After
allocating memory for the second array the function must copy the
elements from the first array into the larger array. Finally, the
function must return a pointer to the new array.
b. In main, allocate an array on the heap that is just large enough to
store the integers 5, 7, 3, and 1.
c. Resize the array to store 10 integers by calling the resize
function created in step a. Remove the old (smaller) array from the
heap. Add the numbers 4, 2, and 8 to the end of the new array.
d. Write a sort function that sorts any integer array in increasing
order.
e. Use the sort function to sort the array of numbers in c above.
Display the sorted numbers.
Is there a Dangling pointer issue.
#include <array>
#include <iostream>
void swap(int *xp, int *yp)
int temp = *xp;
*xp = *yp;
*yp = temp;
//Bubble Sort
bool sort(int arr[], int size)
for( int i = 0; i< size -1; i++)
for( int j = 0; j < size - i -1; j++)
//descending order
if(arr[j]<arr[j+1])
swap(&arr[j], &arr[j+1]);
return true;
void Print(int Array[], int nSize)
for( int i = 0; i < nSize; i++)
std::cout<<" "<<Array[i];
std::cout<<"n";
void Resize( int *&Array, const int& nSizeOld, const int& nSize )
int * newArray = new int[nSize];
//Copy Elements of the Array
for(int i = 0; i< nSizeOld; i++)
newArray[i] = Array[i];
delete[] Array;
//Assign ptr of Prev to new Array
Array = newArray;
int _tmain(int argc, _TCHAR* argv[])
const int kNewSize = 10, kSize = 5;
int *pMyArray = new int[kSize];
//Set Values
for( int i = 0; i< kSize; ++i )
pMyArray[i] = i * 5;
Resize( pMyArray, kSize, kNewSize );
//Set Values
for( int i = kSize; i< kNewSize; ++i )
pMyArray[i] = i * 10;
Print(pMyArray, kNewSize);
sort(pMyArray, kNewSize);
Print(pMyArray, kNewSize);
if( pMyArray!=NULL )
delete[] pMyArray;
return 0;
c++ c++11 pointers
New contributor
$endgroup$
add a comment |
$begingroup$
I have answered a Question in Stackoverflow link.
a) Create a function called resize that can be used to increase the
size of integer arrays dynamically. The function takes three
parameters. The first parameter is the original array, the second
parameter is the size of this array, and the third parameter is the
size of the larger array to be created by this function. Make sure
that you allocate memory from the heap inside this function. After
allocating memory for the second array the function must copy the
elements from the first array into the larger array. Finally, the
function must return a pointer to the new array.
b. In main, allocate an array on the heap that is just large enough to
store the integers 5, 7, 3, and 1.
c. Resize the array to store 10 integers by calling the resize
function created in step a. Remove the old (smaller) array from the
heap. Add the numbers 4, 2, and 8 to the end of the new array.
d. Write a sort function that sorts any integer array in increasing
order.
e. Use the sort function to sort the array of numbers in c above.
Display the sorted numbers.
Is there a Dangling pointer issue.
#include <array>
#include <iostream>
void swap(int *xp, int *yp)
int temp = *xp;
*xp = *yp;
*yp = temp;
//Bubble Sort
bool sort(int arr[], int size)
for( int i = 0; i< size -1; i++)
for( int j = 0; j < size - i -1; j++)
//descending order
if(arr[j]<arr[j+1])
swap(&arr[j], &arr[j+1]);
return true;
void Print(int Array[], int nSize)
for( int i = 0; i < nSize; i++)
std::cout<<" "<<Array[i];
std::cout<<"n";
void Resize( int *&Array, const int& nSizeOld, const int& nSize )
int * newArray = new int[nSize];
//Copy Elements of the Array
for(int i = 0; i< nSizeOld; i++)
newArray[i] = Array[i];
delete[] Array;
//Assign ptr of Prev to new Array
Array = newArray;
int _tmain(int argc, _TCHAR* argv[])
const int kNewSize = 10, kSize = 5;
int *pMyArray = new int[kSize];
//Set Values
for( int i = 0; i< kSize; ++i )
pMyArray[i] = i * 5;
Resize( pMyArray, kSize, kNewSize );
//Set Values
for( int i = kSize; i< kNewSize; ++i )
pMyArray[i] = i * 10;
Print(pMyArray, kNewSize);
sort(pMyArray, kNewSize);
Print(pMyArray, kNewSize);
if( pMyArray!=NULL )
delete[] pMyArray;
return 0;
c++ c++11 pointers
New contributor
$endgroup$
add a comment |
$begingroup$
I have answered a Question in Stackoverflow link.
a) Create a function called resize that can be used to increase the
size of integer arrays dynamically. The function takes three
parameters. The first parameter is the original array, the second
parameter is the size of this array, and the third parameter is the
size of the larger array to be created by this function. Make sure
that you allocate memory from the heap inside this function. After
allocating memory for the second array the function must copy the
elements from the first array into the larger array. Finally, the
function must return a pointer to the new array.
b. In main, allocate an array on the heap that is just large enough to
store the integers 5, 7, 3, and 1.
c. Resize the array to store 10 integers by calling the resize
function created in step a. Remove the old (smaller) array from the
heap. Add the numbers 4, 2, and 8 to the end of the new array.
d. Write a sort function that sorts any integer array in increasing
order.
e. Use the sort function to sort the array of numbers in c above.
Display the sorted numbers.
Is there a Dangling pointer issue.
#include <array>
#include <iostream>
void swap(int *xp, int *yp)
int temp = *xp;
*xp = *yp;
*yp = temp;
//Bubble Sort
bool sort(int arr[], int size)
for( int i = 0; i< size -1; i++)
for( int j = 0; j < size - i -1; j++)
//descending order
if(arr[j]<arr[j+1])
swap(&arr[j], &arr[j+1]);
return true;
void Print(int Array[], int nSize)
for( int i = 0; i < nSize; i++)
std::cout<<" "<<Array[i];
std::cout<<"n";
void Resize( int *&Array, const int& nSizeOld, const int& nSize )
int * newArray = new int[nSize];
//Copy Elements of the Array
for(int i = 0; i< nSizeOld; i++)
newArray[i] = Array[i];
delete[] Array;
//Assign ptr of Prev to new Array
Array = newArray;
int _tmain(int argc, _TCHAR* argv[])
const int kNewSize = 10, kSize = 5;
int *pMyArray = new int[kSize];
//Set Values
for( int i = 0; i< kSize; ++i )
pMyArray[i] = i * 5;
Resize( pMyArray, kSize, kNewSize );
//Set Values
for( int i = kSize; i< kNewSize; ++i )
pMyArray[i] = i * 10;
Print(pMyArray, kNewSize);
sort(pMyArray, kNewSize);
Print(pMyArray, kNewSize);
if( pMyArray!=NULL )
delete[] pMyArray;
return 0;
c++ c++11 pointers
New contributor
$endgroup$
I have answered a Question in Stackoverflow link.
a) Create a function called resize that can be used to increase the
size of integer arrays dynamically. The function takes three
parameters. The first parameter is the original array, the second
parameter is the size of this array, and the third parameter is the
size of the larger array to be created by this function. Make sure
that you allocate memory from the heap inside this function. After
allocating memory for the second array the function must copy the
elements from the first array into the larger array. Finally, the
function must return a pointer to the new array.
b. In main, allocate an array on the heap that is just large enough to
store the integers 5, 7, 3, and 1.
c. Resize the array to store 10 integers by calling the resize
function created in step a. Remove the old (smaller) array from the
heap. Add the numbers 4, 2, and 8 to the end of the new array.
d. Write a sort function that sorts any integer array in increasing
order.
e. Use the sort function to sort the array of numbers in c above.
Display the sorted numbers.
Is there a Dangling pointer issue.
#include <array>
#include <iostream>
void swap(int *xp, int *yp)
int temp = *xp;
*xp = *yp;
*yp = temp;
//Bubble Sort
bool sort(int arr[], int size)
for( int i = 0; i< size -1; i++)
for( int j = 0; j < size - i -1; j++)
//descending order
if(arr[j]<arr[j+1])
swap(&arr[j], &arr[j+1]);
return true;
void Print(int Array[], int nSize)
for( int i = 0; i < nSize; i++)
std::cout<<" "<<Array[i];
std::cout<<"n";
void Resize( int *&Array, const int& nSizeOld, const int& nSize )
int * newArray = new int[nSize];
//Copy Elements of the Array
for(int i = 0; i< nSizeOld; i++)
newArray[i] = Array[i];
delete[] Array;
//Assign ptr of Prev to new Array
Array = newArray;
int _tmain(int argc, _TCHAR* argv[])
const int kNewSize = 10, kSize = 5;
int *pMyArray = new int[kSize];
//Set Values
for( int i = 0; i< kSize; ++i )
pMyArray[i] = i * 5;
Resize( pMyArray, kSize, kNewSize );
//Set Values
for( int i = kSize; i< kNewSize; ++i )
pMyArray[i] = i * 10;
Print(pMyArray, kNewSize);
sort(pMyArray, kNewSize);
Print(pMyArray, kNewSize);
if( pMyArray!=NULL )
delete[] pMyArray;
return 0;
c++ c++11 pointers
c++ c++11 pointers
New contributor
New contributor
edited 2 mins ago
f1r361rd
New contributor
asked 1 hour ago
f1r361rdf1r361rd
113
113
New contributor
New contributor
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
$begingroup$
If you had tagged this code as C, it would have been acceptable. Since you tagged it as C++, it's horrible.
Instead of writing your own swap
function, there's already std::swap
in <algorithm>
.
Instead of writing bubble sort yourself, just use std::sort
, also from <algorithm>
.
Instead of using arrays and resizing them yourself, just use std::vector<int>
, from <vector>
.
After applying these transformations, you cannot have a dangling pointer anymore since your code is completely pointer-free.
As part of an exercise for learning the basic operations on memory management, it's ok to write code like this, but never ever use such code in production. In production the code should look like this:
#include <algorithm>
#include <iostream>
#include <vector>
void Print(const std::vector<int> &nums)
for(int num : nums)
std::cout << " " << num;
std::cout << "n";
int main()
std::vector<int> nums 5, 7, 3, 1 ;
// There's probably a more elegant way to add the elements to the vector.
nums.push_back(4);
nums.push_back(2);
nums.push_back(8);
std::sort(nums.begin(), nums.end());
Print(nums);
By the way, your original code doesn't have any dangling pointer as well. Well done.
You don't need the != NULL
check before the delete[]
since that pointer cannot be null. In modern C++ (since C++11 I think) you would also write nullptr
instead of NULL
. The reason is that historically NULL
had not been guaranteed to be of pointer type.
Have a look at https://www.cplusplus.com/reference/algorithm/ for more algorithms that you shouldn't implement yourself in C++.
I would have liked to write the push_back
block in a shorter way, as well as the Print
function. I'm sure there's a more elegant way, I just don't know it.
$endgroup$
add a comment |
$begingroup$
The code is obviously wrong: your compiler should have warmed you that Resize()
never uses its nSizeOld
parameter.
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
f1r361rd is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f218994%2farray-dynamic-resize-in-heap%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
If you had tagged this code as C, it would have been acceptable. Since you tagged it as C++, it's horrible.
Instead of writing your own swap
function, there's already std::swap
in <algorithm>
.
Instead of writing bubble sort yourself, just use std::sort
, also from <algorithm>
.
Instead of using arrays and resizing them yourself, just use std::vector<int>
, from <vector>
.
After applying these transformations, you cannot have a dangling pointer anymore since your code is completely pointer-free.
As part of an exercise for learning the basic operations on memory management, it's ok to write code like this, but never ever use such code in production. In production the code should look like this:
#include <algorithm>
#include <iostream>
#include <vector>
void Print(const std::vector<int> &nums)
for(int num : nums)
std::cout << " " << num;
std::cout << "n";
int main()
std::vector<int> nums 5, 7, 3, 1 ;
// There's probably a more elegant way to add the elements to the vector.
nums.push_back(4);
nums.push_back(2);
nums.push_back(8);
std::sort(nums.begin(), nums.end());
Print(nums);
By the way, your original code doesn't have any dangling pointer as well. Well done.
You don't need the != NULL
check before the delete[]
since that pointer cannot be null. In modern C++ (since C++11 I think) you would also write nullptr
instead of NULL
. The reason is that historically NULL
had not been guaranteed to be of pointer type.
Have a look at https://www.cplusplus.com/reference/algorithm/ for more algorithms that you shouldn't implement yourself in C++.
I would have liked to write the push_back
block in a shorter way, as well as the Print
function. I'm sure there's a more elegant way, I just don't know it.
$endgroup$
add a comment |
$begingroup$
If you had tagged this code as C, it would have been acceptable. Since you tagged it as C++, it's horrible.
Instead of writing your own swap
function, there's already std::swap
in <algorithm>
.
Instead of writing bubble sort yourself, just use std::sort
, also from <algorithm>
.
Instead of using arrays and resizing them yourself, just use std::vector<int>
, from <vector>
.
After applying these transformations, you cannot have a dangling pointer anymore since your code is completely pointer-free.
As part of an exercise for learning the basic operations on memory management, it's ok to write code like this, but never ever use such code in production. In production the code should look like this:
#include <algorithm>
#include <iostream>
#include <vector>
void Print(const std::vector<int> &nums)
for(int num : nums)
std::cout << " " << num;
std::cout << "n";
int main()
std::vector<int> nums 5, 7, 3, 1 ;
// There's probably a more elegant way to add the elements to the vector.
nums.push_back(4);
nums.push_back(2);
nums.push_back(8);
std::sort(nums.begin(), nums.end());
Print(nums);
By the way, your original code doesn't have any dangling pointer as well. Well done.
You don't need the != NULL
check before the delete[]
since that pointer cannot be null. In modern C++ (since C++11 I think) you would also write nullptr
instead of NULL
. The reason is that historically NULL
had not been guaranteed to be of pointer type.
Have a look at https://www.cplusplus.com/reference/algorithm/ for more algorithms that you shouldn't implement yourself in C++.
I would have liked to write the push_back
block in a shorter way, as well as the Print
function. I'm sure there's a more elegant way, I just don't know it.
$endgroup$
add a comment |
$begingroup$
If you had tagged this code as C, it would have been acceptable. Since you tagged it as C++, it's horrible.
Instead of writing your own swap
function, there's already std::swap
in <algorithm>
.
Instead of writing bubble sort yourself, just use std::sort
, also from <algorithm>
.
Instead of using arrays and resizing them yourself, just use std::vector<int>
, from <vector>
.
After applying these transformations, you cannot have a dangling pointer anymore since your code is completely pointer-free.
As part of an exercise for learning the basic operations on memory management, it's ok to write code like this, but never ever use such code in production. In production the code should look like this:
#include <algorithm>
#include <iostream>
#include <vector>
void Print(const std::vector<int> &nums)
for(int num : nums)
std::cout << " " << num;
std::cout << "n";
int main()
std::vector<int> nums 5, 7, 3, 1 ;
// There's probably a more elegant way to add the elements to the vector.
nums.push_back(4);
nums.push_back(2);
nums.push_back(8);
std::sort(nums.begin(), nums.end());
Print(nums);
By the way, your original code doesn't have any dangling pointer as well. Well done.
You don't need the != NULL
check before the delete[]
since that pointer cannot be null. In modern C++ (since C++11 I think) you would also write nullptr
instead of NULL
. The reason is that historically NULL
had not been guaranteed to be of pointer type.
Have a look at https://www.cplusplus.com/reference/algorithm/ for more algorithms that you shouldn't implement yourself in C++.
I would have liked to write the push_back
block in a shorter way, as well as the Print
function. I'm sure there's a more elegant way, I just don't know it.
$endgroup$
If you had tagged this code as C, it would have been acceptable. Since you tagged it as C++, it's horrible.
Instead of writing your own swap
function, there's already std::swap
in <algorithm>
.
Instead of writing bubble sort yourself, just use std::sort
, also from <algorithm>
.
Instead of using arrays and resizing them yourself, just use std::vector<int>
, from <vector>
.
After applying these transformations, you cannot have a dangling pointer anymore since your code is completely pointer-free.
As part of an exercise for learning the basic operations on memory management, it's ok to write code like this, but never ever use such code in production. In production the code should look like this:
#include <algorithm>
#include <iostream>
#include <vector>
void Print(const std::vector<int> &nums)
for(int num : nums)
std::cout << " " << num;
std::cout << "n";
int main()
std::vector<int> nums 5, 7, 3, 1 ;
// There's probably a more elegant way to add the elements to the vector.
nums.push_back(4);
nums.push_back(2);
nums.push_back(8);
std::sort(nums.begin(), nums.end());
Print(nums);
By the way, your original code doesn't have any dangling pointer as well. Well done.
You don't need the != NULL
check before the delete[]
since that pointer cannot be null. In modern C++ (since C++11 I think) you would also write nullptr
instead of NULL
. The reason is that historically NULL
had not been guaranteed to be of pointer type.
Have a look at https://www.cplusplus.com/reference/algorithm/ for more algorithms that you shouldn't implement yourself in C++.
I would have liked to write the push_back
block in a shorter way, as well as the Print
function. I'm sure there's a more elegant way, I just don't know it.
edited 31 secs ago
answered 26 mins ago
Roland IlligRoland Illig
11.9k11948
11.9k11948
add a comment |
add a comment |
$begingroup$
The code is obviously wrong: your compiler should have warmed you that Resize()
never uses its nSizeOld
parameter.
$endgroup$
add a comment |
$begingroup$
The code is obviously wrong: your compiler should have warmed you that Resize()
never uses its nSizeOld
parameter.
$endgroup$
add a comment |
$begingroup$
The code is obviously wrong: your compiler should have warmed you that Resize()
never uses its nSizeOld
parameter.
$endgroup$
The code is obviously wrong: your compiler should have warmed you that Resize()
never uses its nSizeOld
parameter.
answered 9 mins ago
200_success200_success
131k17157422
131k17157422
add a comment |
add a comment |
f1r361rd is a new contributor. Be nice, and check out our Code of Conduct.
f1r361rd is a new contributor. Be nice, and check out our Code of Conduct.
f1r361rd is a new contributor. Be nice, and check out our Code of Conduct.
f1r361rd is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f218994%2farray-dynamic-resize-in-heap%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown